堆栈展开和指针

Stack unwinding and pointers

本文关键字:指针 堆栈      更新时间:2023-10-16
#include <iostream>
using namespace std;
class BaseClass
{
public:
    BaseClass(int i)
    {
        data = i;
        cout << "_____BaseClass()____" << endl;
    }
    ~BaseClass()
    {
        data = -99;
        cout << "_____~BaseClass()____" << endl;
    }
    void Fun()
    {
        cout << "_____Fun()____" << data << endl;
    }
    int data;
};
int main()
{
    BaseClass *b = NULL;
    {
        BaseClass b1(300);
        b = &b1;
    }
    b->Fun();
    return 0;
}

实例b1是在一个段中创建的,它的生命周期仅限于该段。我不明白为什么即使在析构函数之后也可以访问数据和方法。

c++作为一种语言提供了一些保证,但在许多方面没有定义。这意味着,对于某些代码,标准不强制要求任何行为,因此,编译器可以完成任何事情。你就是这种情况。

我不明白为什么在析构函数之后还可以访问数据和方法。

对象一旦被销毁,通过指针(或其他东西)访问它是未定义的。你能否在程序的某个实例中访问它并不重要。在其他一些情况下,您可能无法更改机器,内存管理方案或任何其他环境因素可能导致程序崩溃,挂起等,即语言在这里不保证任何事情。

作为一般规则,你不应该编写调用未定义行为的代码,除非你试图学习一些东西。