gpt4 book ai didi

c++ - 使用 shared_ptr 时奇怪的双析构函数调用

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

最后我找到了一个非常奇怪的错误,这是由两次调用析构函数引起的。这是重现错误的最少代码:

#include <iostream>
#include <memory>
#include <set>

class cEventSystem {
public:
cEventSystem() {
std::cout << "constructor: " << this << std::endl;
}
~cEventSystem() {
std::cout << "destructor: " << this << std::endl;
}
};

class cSubscriber {
public:
cSubscriber(cEventSystem& eventSystem) : eventSystem(eventSystem) {}
virtual ~cSubscriber() {}
virtual void onEvent() = 0;
protected:
cEventSystem& eventSystem;
};

class cTileBrowser: public cSubscriber {
public:
cTileBrowser(cEventSystem eventSystem) : cSubscriber(eventSystem) {}
void onEvent() {}
};

class cGui: public cSubscriber {
public:
cGui(cEventSystem& eventSystem) : cSubscriber(eventSystem) {
tileBrowser = std::make_shared<cTileBrowser>(eventSystem);
}
void onEvent() {}
std::shared_ptr<cTileBrowser> tileBrowser;
};

int main() {
cEventSystem eventSystem;
cGui gui(eventSystem);
}

输出是:

 constructor: 0x7fffffffe67f
destructor: 0x7fffffffe2df
destructor: 0x7fffffffe67f

如您所见,第一个析构函数是不需要的,它在根本未构造的不同对象上调用(地址不同),但在我的真实代码中,地址足够接近并且它破坏了我拥有的容器在事件系统中。

调试表明是 make_shared 导致了析构函数调用。

是什么导致了不需要的析构函数调用,我该如何摆脱它?我使用带有 c++11 标志的 g++4.7。

问题是不需要的析构函数调用通常(90% 的时间)会破坏我真实代码中的事件系统容器,这会导致段错误,但它很少不会破坏它并且一切正常。

最佳答案

CTileBrowser 构造函数正在按值获取其参数。您可能会看到为该构造函数创建的临时拷贝的破坏。将其更改为引用参数,我敢打赌问题就会消失。

关于c++ - 使用 shared_ptr 时奇怪的双析构函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14740765/

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