相同的对象(由内存地址推导)构造两次而没有破坏

Sam*_*rsa 5 c++ constructor destructor

请注意,我试图写一个小例子来复制这个问题,但到目前为止我没有这样的运气.有问题的代码是我不能放在这里的大型框架的一部分.

我有一个模板类,有一个数据成员.这个类的构造函数有副作用,只能在该对象上调用一次(假设ctor只能被调用一次 - 这应该是真的).

经过一段时间试图弄清楚为什么要进行两次调用之后,我暂时跟踪对象的内存地址(使用地图),看看它是否确实是在没有调用析构函数的情况下重新构造的对象(I 解析析构函数中的地址,因此如果首先销毁原始对象,则另一个对象可以取代它.跟踪器将触发一个断言,如果相同的地址再次跟踪(不untracking第一).

我很困惑地看到对象的构造函数被调用了两次而我的临时内存跟踪器触发了一个断言.使用断点进行调试可确认连续两次调用构造函数,而无需插入任何其他代码.也就是说,在退出对象的内存地址所在的类的构造函数后,xyz由于某种原因我再次进入它并且内存地址是相同的xyz.

对这种行为可能有什么解释? 我尽力解释.随意要求澄清.

Sam*_*rsa 1

供将来遇到这种异常情况的人参考,好吧,这不是异常情况。

指向结构对象的指针指向其初始成员(除非该类是多态的)。所以在下面的代码中,this的指针foo<bar>指向m_value第一个数据成员。

#include <iostream>
using namespace std;

template <typename T>
struct foo
{
    foo()
    {
        std::cout << "\nConstructed: " << (void*)(this);
    }

    T m_value;
};

struct bar
{
    foo<int> m_value;
};

int main() {
    foo<bar> f;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)