0

私が構造を持っている場合:

typedef struct {
  unsigned char data[HEX_FLASH_BUFFER];
  bool isLoad;
  unsigned int length;
} s_hexFLASH;

typedef struct {
  s_hexFLASH flash;
} s_hexFile;

s_hexFile *hex = new s_hexFile;

この構造全体を削除するにはどうすればよいですか?なぜなら、このようなことをしたとき:

delete[] hex->flash.data;

この後もデータを読み取ることができます。

cout << hex->flash.data[0] << endl;
4

5 に答える 5

4

unsigned char data[HEX_FLASH_BUFFER];自動ストレージ期間を使用して固定長の配列を定義します。これは、構造オブジェクトの割り当てが解除されたときに自動的に割り当てが解除されることを意味します。

言い換えれば、あなたはそれを呼び出すことによってそれを割り当てていないnew[]ので、それを呼び出す理由はありませんdelete[]

于 2013-02-17T17:48:55.883 に答える
4

dataそもそも動的に割り当てられないため、削除する必要はありません。deleteとペアになりnewます。だから電話delete hex;

deleteとはいえ、最近のC ++では、基本的にキーワードを手動で使用しません。スマートポインタshared_ptrを使用して、unique_ptr動的に割り当てられたメモリを管理します。ただし、ローカル(自動)変数を使用するのが一般的です。

また、注意してください:typedef struct { ... } name;だけである必要がありますstruct name {...};。前者は古風です。

于 2013-02-17T17:49:02.410 に答える
1

delete(およびdelete[])動的に割り当てられたメモリの割り当てを解除するだけです(POD以外のタイプのデストラクタを実行しますが、現在は重要ではありません)。

dataここに自動保存期間があります。ここでは機能しないだけでなくdelete[]、未定義の動作を引き起こします。delete動的に割り当てられていないメモリを実行しようとすると、優れたコンパイラが警告を発します。

メモリが「使用中」としてマークされなくなった場合でも、アクセスできますが、これにより未定義の動作が発生します。

于 2013-02-17T17:51:44.990 に答える
0
delete hex;

16進構造に割り当てられたメモリを削除します

于 2013-02-17T17:50:04.493 に答える