0

以下のように定義された構造体が配列に動的に割り当てられているとします。割り当てられた構造を安全に削除するには、タイプ、ラベル、および説明をnullで終了する必要がありますか?

struct operation_data
{
    int number;             
    char* type;             
    char* label;                
    char* description;
}

operation *data=new operation_data[5];  
for (int i=0; i<5; i++)
{
    data[i].type=new char[250];
    data[i].label=new char[250];
    data[i].description=new char[250];
}    
for (int i=0; i<5; i++)
{
    if (data[i].type) delete[] data[i].type;
    if (data[i].label) delete[] data[i].label;
    if (data[i].description) delete[] data[i].description;    
}

私のコードは上記のスニペットを表しています。これにより、2番目のdeleteステートメントでヒープ破損が検出されたというエラーが発生します。これを修正するのを手伝ってください。

4

5 に答える 5

3

いいえ。構造体を削除すると、構造体自体の最大16バイトのメモリ(1つのintと3つのポインタ)のみが削除されます。ポインタが指しているメモリを実際に削除しているわけではありません。これは個別に行う必要があり、ヌル終了は必要ありません。

于 2012-07-05T15:20:53.080 に答える
3

それらが実際に配列である場合は、で作成されている必要がありますnew[]

その場合は、で削除する必要がありdelete[]ます。これにより、アレイの割り当てが正しく解除されます。

だから、あなたはどこかにあるべきです:

char* description = new [someSize];

それを削除するには、次のようにする必要があります。

delete [] description;

また、c ++を使用している場合は、std::stringの代わりにを使用できますchar*。これにより、文字列が破棄されたときに、基になるメモリが自動的に解放されます。

于 2012-07-05T15:19:52.470 に答える
2

いいえ、配列を削除するためにnullで終了する必要はありません。で割り当てられている場合は、内容に関係なく、new char[size]で削除できますdelete []

それらが割り当てられている場合は、構造体自体を削除する前に、それぞれを削除する必要があります。メンバーポインタは自動的に削除されません。

ヌル終了文字列を処理するCライブラリの関数などでそれらを使用するには、ヌル終了が必要です。C ++では、通常std::string、メモリ割り当てを管理する標準クラスを使用する方が便利です。

于 2012-07-05T15:20:41.860 に答える
1

いいえ、null で終了する必要はありません。null 終了は、char 配列内の文字列がどこで終了するかを示す指標にすぎません。

安全に削除するには、構造体に ctor と dtor を追加することをお勧めします。

struct operation {
  int number;
  char* type;
  char* label;
  char* description;

  operation() : type(0), label(0), description(0) {}
  ~operation() {
    if( type )
          delete[] type;
    if( label )
      delete[] label;
    if( description )
      delete[] description;
  }
};
于 2012-07-05T15:32:02.733 に答える
0

タイプ、ラベル、および説明はnullで終了する必要はありません

于 2012-07-05T15:21:04.133 に答える