空对象正在调用方法,但程序不会崩溃..怎么...为什么?

时间:2018-07-28 19:23:03

标签: c++

我正在尝试一些代码。错误地写了下面的代码(幸运的是现在)

代码段1

#include<iostream>
using namespace std;

class A {
public:
    A() { cout << "A()" << endl; }
    ~A() { cout << "~A()" << endl; }
    void print() { cout << "A::print()=>" <<this<< endl; }
};

int main() {
    A* a = new A;
    a->print();
    delete a;
    a = NULL;
    cout << a << endl;  
    a->print();
    return 0;
}

据我所知,由于我删除了“ a”,因此程序应该崩溃了(现在还不是真的)。但事实并非如此。能不能请您解释一下这背后的原因。输出图像也已附加。

但是,只要在上述程序中包含任何成员变量,它就会崩溃。 怎么样 ?为什么呢请参阅程序2。

代码段2

class A {
int val;
public:
    A() { cout << "A()" << endl; }
    ~A() { cout << "~A()" << endl; }
    void print() { cout << "A::print()=>" <<this << val << endl; }
};

int main() {
    A* a = new A;
    a->print();
    delete a;
    a = NULL;
    cout << a << endl;  
    a->print();
    return 0;
}

上述程序崩溃。为什么不选择第一个程序?

PS:有可能是重复的问题。我试图找到这样的问题,但找不到。尽管我得到了this question,但我觉得它与我要寻找的不一样。

enter image description here

1 个答案:

答案 0 :(得分:1)

第一个不会取消引用任何东西指向的内存,因此可能不会崩溃。您只打印出this,它是一个指针值,并且不会取消引用它。请注意,这并不表示可以正常使用!绝对不允许,不应该这样做。完成后会发生什么事?未定义

您的第二个示例实际上尝试使用成员变量,这意味着试图访问无效的内存。这也是未定义的行为,可能会导致崩溃或其他原因。它是未定义的。