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