0

假设如下定义的结构在数组中动态分配。为了安全地删除分配的结构,类型、标签和描述是否需要空终止?

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;    
}

我的代码代表上面的代码片段。这导致在第二个删除语句中检测到堆损坏错误。请帮我纠正这个问题。

4

5 回答 5

3

如果它们真的是数组,那么它们一定是用new[].

在这种情况下,您必须使用 删除它们delete[],这应该会正确释放数组。

所以,你应该有某个地方:

char* description = new [someSize];

并删除它,你应该这样做:

delete [] description;

此外,如果您使用的是 c++,则可以std::string使用char*. 这样,当字符串被销毁时,底层内存会自动释放。

于 2012-07-05T15:19:52.470 回答
3

不,当你删除结构时,你只删除了结构本身的大约 16 个字节的内存(一个 int 和三个指针)。您实际上并没有删除指针指向的内存。您必须单独执行此操作,并且不需要空终止。

于 2012-07-05T15:20:53.080 回答
2

不,删除数组不需要空终止。如果它们是用 分配的,那么无论它们的内容如何,new char[size]​​都可以用 删除它们。delete []

如果它们已被分配,那么您需要在删除结构本身之前删除它们中的每一个;成员指针不会自动删除。

空终止对于将它们与诸如 C 库中处理空终止字符串的函数一起使用是必要的。在 C++ 中,使用标准类通常更方便std::string,它为您管理内存分配。

于 2012-07-05T15:20:41.860 回答
1

不,它们不需要以空值终止。空终止只是 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 回答