gpt4 book ai didi

c++ - 同一对象(由内存地址推导)构造两次而没有破坏

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:48:23 24 4
gpt4 key购买 nike

请注意,我正在尝试编写一个小示例来重现此问题,但到目前为止我还没有成功。有问题的代码是我不能放在这里的大型框架的一部分。

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

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

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

这种行为的可能解释是什么?我尽力解释。随时要求澄清。

最佳答案

为了将来遇到这种异常的任何人引用,好吧,这不是异常。

A pointer to a structure object points to its initial member (除非类是多态的)。所以在 following code , 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;
}

关于c++ - 同一对象(由内存地址推导)构造两次而没有破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22446562/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com