【发布时间】:2019-05-20 08:36:06
【问题描述】:
请检查下面 foo 函数的析构函数。如果我删除 p 指针,那么它运行良好。但是如果我在主程序中做同样的事情,那么我会得到一个错误。为什么它允许我在析构函数中这样做?
附:我知道删除指针没有意义,因为没有动态分配的内存。
class foo
{
int* p;
public:
~foo()
{
delete p; // runs fine
cout << "Destructor run \n";
}
};
int main()
{
int* p;
delete p; // This will cause error "uninitialized local variable 'p' used "
foo test; // destructor runs fine at the end of the program
return 0;
}
【问题讨论】:
-
不是没看到问题就没事。这两种情况都是未定义的行为。
-
“我知道删除指针没有意义,因为没有动态分配的内存。” 并不是没有意义。这是因为您不允许
delete一个不指向newed 的指针(除了删除不做任何事情的nullptr之外)。虽然在这种情况下,由于指针未初始化,您甚至无法达到破坏该规则的地步。 -
它运行不正常。这是未定义的行为,您很幸运/不幸没有崩溃。
-
删除随机指针会导致未定义的行为。有时编译器可以看穿这一点并警告你,有时他们不会。问题依然存在。
-
编译器可以看到
main中p不可能在delete p之前被初始化并且可以通知你。这很简单,但是因为在foop中未初始化为成员变量,编译器稍后可以找到初始化它的构造函数或其他方法,跟踪它未初始化是模糊的,并且需要相当大多数编译器都不会费心的大量额外工作和簿记。
标签: c++ pointers destructor delete-operator