Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回对象的实例并通过句柄使用它_C++ - Fatal编程技术网

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

C++ 返回对象的实例并通过句柄使用它,c++,C++,我最近一直在玩一些代码,我对一件事很好奇,我不确定我是否找到了正确的答案。那么,让我们假设我已经定义了以下类 class Thing { public: int m_Integer = 0; Thing() { std::cout << "Thing constructor has been called! Address: " << this << ".\n "; } ~Thing() noexcept {

我最近一直在玩一些代码,我对一件事很好奇,我不确定我是否找到了正确的答案。那么,让我们假设我已经定义了以下类

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;
    }
};

日志告诉我构造函数和析构函数都被调用了。这是否意味着我已经在堆栈上分配了一些内存,它有一个类似布局的Thing type对象,但对象本身已经不存在了?

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

您创建了一个临时对象,并获得了指向该对象的指针,该指针在对象超出范围时立即失效。这里没有任何类型的句柄,问题是我有一个指向这个对象的指针,允许我将它转换为对象类型,并查看它背后的内容。令我惊讶的是,这里没有加巴特,所有的东西看起来都像是找到了,好像没有呼叫破坏者。这就是困扰我的地方。访问指针指向的值是未定义的行为。对这样一个行动的结果抱有任何期望是错误的。好吧,谢谢你的回答。好吧,这是我一开始的想法,但在我这么做的时候。。。事物*pThing=静态施法(hThing)。。。并且检查了Thing类型成员的值,看起来很好。这让我得出了一个结论,我肯定遗漏了一些重要的内容。@J.White是的,如果系统在下面没有分配堆栈空间,则成员值不会更改,但系统可能会随时以任何值将此空闲内存分配给其他人。
void* hThing = Thing::CreateInstance().GetThis();