2012-01-07 14 views
2

スペースが最初に割り当てられた場所とは異なる機能の記憶域を削除すると、未定義の動作が発生しますか?C++は、割り当てられた場所と異なる機能の記憶域を削除します。

typedef struct { 
    unsigned int Data1; 
    unsigned int Data2; 
    unsigned int Data3; 
}TData; 

void CreateStorage(void) 
{ 
    TData *TempData = new TData; 

    DeleteStorage((unsigned char*)TempData); 
} 

void DeleteStorage(unsigned char *StorageToDelete) 
{ 
    delete (TData*)StorageToDelete; 
} 
+0

いいえ.............. – JosephH

答えて

1

[注:あなたがそのキャストは必要ありません。]

+0

"キャストは必要ありません"とはどういう意味ですか?彼はTDataを割り当て、キャストなしでは無署名のcharを削除します。静的型が動的型と一致しない場合は、削除時に未定義の動作が発生します。 –

+0

@DietmarKühl:質問が編集されました。もともと、どこにも 'unsigned char * 'はありませんでした... –

+0

ああ、私はそれに気付かなかった。 –

3

異なる機能からメモリを割り当てたり削除することは完全に有効です。

0

いいえ、問題ありません。 DeleteStorage()のStorageToDeleteを(TData *)にキャストするのはなぜですか?

0

いいえ、それはいいですし、構造体もtypedefしないでください。ちょうどstruct TData { /*...*/ };と言う。

+0

私はQTを使用しています。ストレージポインタは実際にはイベントとして他の関数に渡されます(emit signalDeleteStorage)。私はシグナルイベントで未定義型を渡すことはできません。したがって、私はポインタを既知の型unsigned charとして渡します。 TDataは未知であるため、私はそれを渡すときにそれをunsigned charにキャストします。コンパイラが割り当て解除するメモリのサイズを知っていることを確認するために、元の型に戻します。これは不要ですか? – user668773

+1

申し訳ありませんが、私はそれを誤解しました。私は2番目の点を削除します。実際、 'delete'はデストラクタを呼び出すので、正しい型を与えるべきです。メモリ解放(これは問題ありません)のためではなく、オブジェクトの破壊のためです。あなたは 'void *'としてそのような "タイプなし"ポインタを渡すべきです、ちょうど整頓されている、例えば 'delete static_cast (StorageToDelete)'と言うべきです。 –

+0

タイプ定義された構造体を使用する理由は、悪い習慣によるものかもしれませんが、私のプログラミングスタイルによるものかもしれません。他の関数へのポインタとして構造体を渡すことがよくあります。あまり面倒なく、ポインタを渡すときに、関数の引数リストに型定義された構造体を使用できるようになりました。この方法では、構造体ポインタを操作するときにキャストは必要ありません。もちろん、与えられた例はunsigned charとして渡されるので適用されませんが、それ以外の場合は構造体型で渡します。 – user668773

0

同じライブラリ内で割り当ておよび割り当てを解除している限り、安全に削除されます。

ただし、異なるライブラリに割り当てたり割り当てを解除したりする場合は注意が必要です。基礎となるクラス定義は異なるライブラリ間で異なる可能性があるので、同じ定義を使用していることを確認する必要があります。

非常に一般的な問題の1つは、プリコンパイルされたオープンソースのC++ライブラリとプログラムを使用していて、ライブラリが異なるC++ランタイムライブラリを使用している場合です。あなたのプログラムによって割り当てられているのは、オープンソースライブラリのそのクラスの定義があなたのものと異なるからです。この問題を解決する一般的な回避策は、使用するコンパイラを使用してオープンソースライブラリを再コンパイルすることです。

+0

QTを使用しています。ストレージポインタは、実際には別の関数にイベントとして渡されます: – user668773

+0

@ user668773そのストレージのデストラクタがライブラリでのみ定義されている場合は問題ありません** – JosephH

関連する問題