Null对象正在调用一个方法,但程序没有崩溃......。为什么? [重复]

问题描述 投票:-2回答:1

这个问题在这里已有答案:

我正在尝试一些代码。错误地写下面的代码(Luckily Now)

片段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

c++
1个回答
1
投票

第一个不会取消引用任何内容指向的任何内存,因此它可能不会崩溃。你只打印出this这是一个指针值而你没有取消引用它。请注意,这并不意味着它没关系并且始终有效!绝对不允许也不应该这样做。完成此操作后会发生什么是未定义的。

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

© www.soinside.com 2019 - 2024. All rights reserved.