rnd*_*gen 4 c++ memory delete-operator
另一个C++指针删除问题在以下示例中:
class Foo {
public:
int *p;
~Foo() {
delete p; p = NULL;
}
};
Foo *f1 = new Foo();
Foo *f2 = new Foo();
f1->p = new int(1);
f2->p = f1->p;
delete f2; // ok
delete f1; // no error?
Run Code Online (Sandbox Code Playgroud)
为什么我在调用"删除f1"时没有收到错误?我没有删除两次相同的地址(*p)吗?
如果我直接删除最后两行代码中的指针,我将收到错误.
delete f2->p; // ok
delete f1->p; // error!! *** glibc detected *** double free or corruption (fasttop) ***
Run Code Online (Sandbox Code Playgroud)
这是一件非常糟糕的事情.但是C++不一定会在这里做任何事情.这是"未定义"的行为.这并不意味着它会崩溃,但很可能会导致糟糕的事故(tm)发生.
编辑:此外,在你的第二个例子中,它崩溃的事实只是"未定义"行为的一部分.关于反应将是什么未定义.