繁体   English   中英

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

[英]Same object (deduced by memory address) constructed twice without destruction

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

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

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

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

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

为了将来参考遇到这种异常的人 ,嗯,这不是异常。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM