我有以下情况,
class foo
{
...
private:
char *_test;
};
void foo::setTest()
{
if( 0 != _test ) delete [] _test;
}
该函数在调用时会引发错误,因为它在尚未分配时setTest
尝试删除。_test
发生这种情况是因为_test
未设置为 0X0。
谁能帮我理解这一点?
我有以下情况,
class foo
{
...
private:
char *_test;
};
void foo::setTest()
{
if( 0 != _test ) delete [] _test;
}
该函数在调用时会引发错误,因为它在尚未分配时setTest
尝试删除。_test
发生这种情况是因为_test
未设置为 0X0。
谁能帮我理解这一点?
您应该在构造函数中初始化 _test NULL
。
喜欢:
foo:foo {
_test = NULL;
}
如果你不 _test 将有垃圾值。
同样正如 Chris 所指出的,作为参数传递给delete
or ( delete[]
) 的值必须是指向先前分配的内存块的指针new
,或者是空指针(在空指针的情况下,删除无效),有效地使您的NULL 检查多余。
好吧,如果_test
没有被分配任何值,那么它具有未定义的值。如果您想要理智的行为,则不能将该值用于任何事情。变量在使用前需要赋值。
顺便说一句,delete
调用delete[]
空指针是安全的,所以== 0
检查是多余的。
有两种可能:
如果您从不初始化foo::_test
,那么在构造您的类时,该变量可能会包含随机数据。C++ 不会将指针初始化为 null(与 Java、C# 或大多数其他高级语言不同)。您应该始终(总是!)初始化指向NULL
或有效值的指针。在构造函数中更改char *_test = NULL;
或以其他方式初始化_test
。
或者,有可能_test
在您的示例中未显示但未设置为NULL
. 每当你删除一个类成员时,你应该把它设置为NULL
之后,以防止这种双重释放问题。