返回对象的实例并通过句柄使用

时间:2019-04-19 08:51:33

标签: c++

最近我一直在玩一些代码,但我一直对我不确定是否能找到正确答案的一件事感到好奇。因此,假设我已经定义了以下类。

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类型的对象,但对象本身已经不存在了?

1 个答案:

答案 0 :(得分:3)

Thing::CreateInstance()返回其内部的本地对象,在GetThis()之后,该对象将被系统自动销毁(调用析构函数)。您获得的hThing是一个意外的地址值。系统已将指针空间从堆栈中释放出来,并且可以随时修改该值。