C++ 同一个对象(由内存地址推断)构造两次而没有破坏

C++ 同一个对象(由内存地址推断)构造两次而没有破坏,c++,constructor,destructor,C++,Constructor,Destructor,请注意,我试图写一个小例子来复制这个问题,但到目前为止,我还没有这样的运气。所讨论的代码是一个大型框架的一部分,我不能在这里介绍 我有一个模板类,它有一个数据成员。这个类的构造函数有副作用,因此它应该只在该对象上调用一次(这里假设只能调用一次ctor,这应该是真的) 在花了相当长的时间试图弄清楚为什么会进行两次调用之后,我临时跟踪了对象的内存地址(使用映射),以查看它是否确实是在没有调用析构函数的情况下重新构造的同一个对象(我在析构函数中取消对地址的跟踪,以便在原始对象先被销毁的情况下,另一个对

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

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

在花了相当长的时间试图弄清楚为什么会进行两次调用之后,我临时跟踪了对象的内存地址(使用映射),以查看它是否确实是在没有调用析构函数的情况下重新构造的同一个对象(我在析构函数中取消对地址的跟踪,以便在原始对象先被销毁的情况下,另一个对象可以取代它)。如果再次跟踪同一地址(不首先取消跟踪),则跟踪器将触发断言

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

这种行为的可能解释是什么?
我试着尽我所能解释。请随意要求澄清。

对于任何遇到这种异常情况的人,以后的参考,嗯,这不是异常情况

A(除非类是多态的)。因此,在中,
foo
this
指针指向第一个数据成员
m_值

#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;
}
#包括
使用名称空间std;
模板
结构foo
{
foo()
{

std::cout发布一些代码示例会很有帮助。如果没有代码,很难猜测。只是一个猜测,你自己在做任何新的放置吗?你忘了带虚拟析构函数了吗?我更倾向于相信你的对象不会正常销毁,所以同一块内存会重新用于另一个obj,而不是调用两次的析构函数对于同一个对象。是的,我在想一个临时变量,可能在内存(堆栈)中的同一个位置?需要代码来获得更多的洞察力…@rholmes:临时变量不应该在另一个变量就位之前先被销毁吗?如果不是,这不是打败了RAII吗?(我很快会发布代码)请把它变成一个--减少代码,检查症状,重复直到它没有发生,备份并减少其他地方的代码,直到代码最小化。