1

我有以下情况,

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

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

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

谁能帮我理解这一点?

4

3 回答 3

3

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

喜欢:

foo:foo {
 _test = NULL;
}

如果你不 _test 将有垃圾值。

同样正如 Chris 所指出的,作为参数传递给deleteor ( delete[]) 的值必须是指向先前分配的内存块的指针new,或者是空指针(在空指针的情况下,删除无效),有效地使您的NULL 检查多余。

于 2010-03-04T01:55:13.713 回答
1

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

顺便说一句,delete调用delete[]空指针是安全的,所以== 0检查是多余的。

于 2010-03-04T01:54:37.240 回答
1

有两种可能:

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

或者,有可能_test在您的示例中未显示但未设置为NULL. 每当你删除一个类成员时,你应该把它设置为NULL之后,以防止这种双重释放问题。

于 2010-03-04T01:55:56.840 回答