堆栈展开和指针
Stack unwinding and pointers
#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++作为一种语言提供了一些保证,但在许多方面没有定义。这意味着,对于某些代码,标准不强制要求任何行为,因此,编译器可以完成任何事情。你就是这种情况。
我不明白为什么在析构函数之后还可以访问数据和方法。
对象一旦被销毁,通过指针(或其他东西)访问它是未定义的。你能否在程序的某个实例中访问它并不重要。在其他一些情况下,您可能无法更改机器,内存管理方案或任何其他环境因素可能导致程序崩溃,挂起等,即语言在这里不保证任何事情。
作为一般规则,你不应该编写调用未定义行为的代码,除非你试图学习一些东西。
相关文章:
- 从堆栈分配的原始指针构造智能指针
- 使用指针计算堆栈问题的大 O 表示法
- 作为指针注入类后重新创建堆栈对象不好吗?
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- 如何按指针查看堆栈跟踪
- 堆栈/帧指针作为外部变量
- 未分配被释放的指针(将堆栈实现为链表时)
- 唯一指针是否在堆或堆栈上分配内存?
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 当我尝试为结构分配新指针时出现堆栈溢出错误
- 复制堆栈上的成员值或使用指针访问它?
- 堆栈对象的强制转换指针
- 如果堆栈在数字较低的地址增长,为什么指针比较会逆转这种情况?
- C++对自动(堆栈)指针使用运算符删除
- 如果没有指针,如何识别堆栈上的内存?
- 我如何转换一个基于动态的,基于指针的int堆栈,以便将其打印成字符串
- C++设置堆栈指针
- 为什么在非指针堆栈分配变量上调用 delete 时C++不给出编译器错误?
- 指向C++中对象的指针 - 堆栈/堆上有什么?
- 如何使用指向数组的指针堆栈,以及在同一命令中访问两个数组