最近我一直在玩一些代码,但我一直对我不确定是否能找到正确答案的一件事感到好奇。因此,假设我已经定义了以下类。
class Thing {
public:
int m_Integer = 0;
Thing() {
std::cout << "Thing constructor has been called! Address: " << this << ".\n ";
}
~Thing() noexcept {
std::cout << "Thing destructor has been called! Address: " << this << ".\n";
}
static Thing CreateInstance() {
return Thing();
}
void* GetThis() {
return this;
}
};
我已经明确定义了默认的ctor和dtor,以查看是否调用了它们。好,那么,我已经创建了一个句柄。
void* hThing = Thing::CreateInstance().GetThis();
日志告诉我,构造函数和析构函数都已被调用。这是否意味着我已经在堆栈上分配了一些内存,该内存的布局类似于Thing类型的对象,但对象本身已经不存在了?
答案 0 :(得分:3)
Thing::CreateInstance()
返回其内部的本地对象,在GetThis()
之后,该对象将被系统自动销毁(调用析构函数)。您获得的hThing
是一个意外的地址值。系统已将指针空间从堆栈中释放出来,并且可以随时修改该值。