0

void ポインターを解放する方法。

struct vStruct {
    void *vPtr;
    struct vStruct *next;
};

struct vStruct sObj;
struct vStruct *sObjNew = sObj;

delete sObjNew->vPtr; -----------> Is this correct way to delete void pointer
delete sObjNew;

void* 引数に適用されたエラー演算子 'delete' の表示には未定義の動作があり、オブジェクトのデストラクタを呼び出さない可能性が最も高いです。

4

3 に答える 3

9

deleteあなたはvoidポインタではありません。なんで?なぜなら:

引数に適用された 'delete' にvoid*は未定義の動作があり、オブジェクトのデストラクタを呼び出さない可能性が最も高いです。

コンパイラはどのようにしてポインティング オブジェクトの型を知るのでしょうか? したがって、どのデストラクタを呼び出す必要がありますか? (ただし、割り当てメカニズムに応じて、解放するメモリの量をおそらく決定できます。)

a を格納しないでくださいvoid*— 代わりに「実際の」ポインタ型を使用してください。真の型を「隠す」必要がある場合は、時代遅れの C の手法ではなく、ポリモーフィズムを採用することを検討してください。

于 2013-05-29T09:19:17.113 に答える
3

どのようにvPtr初期化されましたか?

  • 構造体が所有していないデータを指している場合は、それを破棄してはなりません。
  • を使用して作成されたデータを指す場合mallocは、 を呼び出す必要がありますfree
  • を使用して作成されたデータを指している場合は、正しいデストラクタをnew呼び出す前に、正しい (または互換性のある) 型にキャストする必要があります。delete

サンプルコードはコンパイルさvPtrれませんが、まったく初期化されていないことが示唆されていることに注意してください。vPtr作成するすべてのvStructインスタンスで初期化する必要があります。初期化されていないものを解放しようとすると、vPtr未定義の結果が生じますが、クラッシュする可能性があります。

于 2013-05-29T09:20:51.753 に答える