堆栈展开和指针

时间:2015-08-18 10:16:32

标签: c++ stack destructor

#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是在细分中创建的,其生命仅限于该细分。即使在析构函数之后,我也无法理解数据和方法是如何被访问的。

1 个答案:

答案 0 :(得分:1)

C ++作为一种语言提供了一些保证,并且在许多领域留下了undefined。这意味着,对于某些代码,标准不强制要求任何行为,因此,编译器可以完成任何操作。你处于这种状况。

  

即使在析构函数之后,我也无法理解数据和方法是如何被访问的。

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

作为一般规则,除非您尝试学习某些内容,否则不应编写调用未定义行为的代码。