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