删除内存错误

时间:2010-03-04 01:50:19

标签: c++ memory-management dynamic-memory-allocation delete-operator

我有以下情况,

class foo
{
  ...
  private:
   char *_test;
};

void foo::setTest()
{
  if( 0 != _test ) delete [] _test;
}

函数setTest在调用时会抛出错误,因为它在尚未分配时尝试删除_test。发生这种情况是因为_test未设置为0X0。

任何人都可以帮我理解这个吗?

3 个答案:

答案 0 :(得分:3)

您应该在构造函数中使用NULL初始化_test。

像:

foo:foo {
 _test = NULL;
}

如果你不_test会有垃圾值。

同样如Chris所指出的,作为参数传递给delete或(delete[])的值必须是指向先前用new分配的内存块的指针,或者是空指针(对于空指针,,删除不会产生影响),有效地使您的NULL检查变得多余。

答案 1 :(得分:1)

好吧,如果_test没有分配任何值,那么它有未定义的值。如果你想要理智的行为,你不能将这个值用于任何事情。在使用之前需要分配变量。

顺便说一句,deletedelete[]可以安全地调用空指针,因此== 0检查是多余的。

答案 2 :(得分:1)

有两种可能性:

如果您从未初始化foo::_test,则在构造类时,该变量可能包含随机数据。 C ++不会将指针初始化为null(与Java,C#或大多数其他更高级别的语言不同)。您应始终(始终!)将指针初始化为NULL或有效值。更改为char *_test = NULL;或以其他方式初始化构造函数中的_test

或者,可能会在示例中未显示的其他位置删除_test,但未将其设置为NULL。每当您删除一个类成员时,您应该在之后将其设置为NULL,以防止出现这种双重免费问题。