And*_*kha 5 c++ memory-management
可能重复:
为什么下面的代码没有崩溃,虽然我删除了对象?
今天我发现我对C++内存管理一无所知.请看一下这段代码:
class A
{
public:
A(){std::cout << "constructor called" << this << std::endl;}
~A(){std::cout << "destructor called" << this << std::endl;}
void test (){std::cout << "test" << this << std::endl;}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
A *aa = new A();
delete aa;
aa->test();
aa->test();
aa->test();
std::cout << "still works\n";
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
为什么不崩溃?尽管析构函数被调用,为什么它仍然继续执行?当我调用test方法时,我处理不再属于该应用程序的内存.
更令人惊讶的是,如果我插入它仍然有效,甚至aa = NULL;之后delete aa;.test方法被调用好了.我需要承认我完全糊涂了.析构函数的用途是什么,如果没有效果则赋值为NULL?
Alo*_*ave 10
有两种方法可以回答您的问题:
您的代码具有未定义的行为.
它取消引用一个NULL或一个deleteed指针.根据C++标准,它们都调用Undefined Behavior.它的工作与否是毫无意义的.
未定义的行为意味着任何行为都是可能的,它可能会或可能不会崩溃,但这意味着您的程序无法提供任何明确定义的输出.它只是意味着任何行为都是可能的,并且可能不一致或定义良好.
它不会崩溃,因为编译器this在调用成员函数时实际上没有derefence .除非函数是virtual函数,否则编译器会将成员函数调用转换为通常的函数调用,方法this是将第一个参数作为函数传递给函数.它可以这样做,因为编译器可以准确地确定在编译时自己调用哪个函数.所以实际上,通过删除或NULL指针调用成员函数不会取消引用this(如果它NULL或者deleteed ,则无效).此外,this仅当在函数体内访问任何成员时才解除引用.
在您的情况下,您永远不会访问函数体内的任何成员,因此它不会崩溃.
添加一个成员并在你的函数内取消引用它,它肯定会崩溃.
无论如何,在实际答案中所说的技术答案是高于一切,因为标准说.
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |