使用std::enable_shared_from_this时,析构函数崩溃
Crash in destructor when using std::enable_shared_from_this
我正在尝试编写一个类似boost信号的类(作为学习c++的练习)。我发现当我使用enable_shared_from_this
时,我总是在析构函数中崩溃。这是代码(我使用的是vs2012更新2):
对此有何评论?这个问题应该是由shared_from_this()
引起的,因为当我取消对signal_connection::disconnect
中的行(auto this_ = shared_from_this();
)的注释时,一切都很好。
我知道在调用shared_from_this()
之前,它必须至少有一个有效的shared_ptr。我的代码应该满足这一点。
代码:
#include <memory>
#include <map>
class slot_manager;
class signal_connection: public std::enable_shared_from_this<signal_connection>
{
public:
signal_connection(slot_manager* manager)
:manager_(manager)
{}
public:
void disconnect() ;
private:
slot_manager* manager_;
};
class slot_manager
{
public:
typedef std::shared_ptr<signal_connection> connection_type;
typedef std::map<connection_type, int> map_type;
typedef map_type::value_type map_value_type;
public:
void connect(int slot)
{
std::shared_ptr<signal_connection> c(new signal_connection(this));
slots_.insert(map_value_type(c, slot));
}
~slot_manager()
{
auto iter = slots_.begin();
map_type::iterator iter2 = slots_.end();
while (iter != slots_.end())
{
iter2 = iter++;
iter2->first->disconnect();
}
}
void disconnect(std::shared_ptr<signal_connection> connection)
{
auto c = slots_.find(connection);
if (c != slots_.end())
{
slots_.erase(c);
}
}
protected:
map_type slots_;
};
void signal_connection::disconnect()
{
if (manager_ != nullptr)
{
//auto this_ = shared_from_this();
manager_->disconnect(shared_from_this());
manager_ = nullptr;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
slot_manager x;
x.connect(1);
return 0;
}
问题是,在将其管理器设置为nullptr
之前,disconnect()
中的signal_connection会被解除,这会导致访问冲突,即调用管理器的断开连接。这是因为管理器持有连接的唯一shared_ptr
,而您持有erase()
。该对象无法使自己保持活力。当然,除非您取消对该行的注释。this_
的寿命刚好可以解决这个问题。
相关文章:
- 内联映射初始化的动态atexit析构函数崩溃
- 递归导致程序崩溃,但 while 循环中的相同概念不是来自C++析构函数
- 在C++中删除指针数组时析构函数崩溃
- C++ - 定义自定义析构函数时程序崩溃
- 引发导致调用析构函数的异常会使程序崩溃
- 使用指针的矢量矩阵在对象上调用析构函数时程序崩溃
- 程序在析构函数处崩溃
- 在析构函数之后打开新的QMainWindow崩溃
- 清理所拥有的(!)字符串成员时,析构函数偶尔崩溃
- 创建'new'实例可以解决析构函数崩溃问题?
- C++SDL_FreeSurface在析构函数中崩溃
- 执行析构函数时,服务器应用程序总是崩溃
- 为什么调用基类析构函数会使此程序崩溃
- 在未使用的类的默认析构函数处崩溃
- 基类析构函数不是虚拟的,子类析构函数是虚拟的,程序崩溃
- 空析构函数崩溃程序:C++
- boost::任何析构函数崩溃
- VS CTP 14的std::线程析构函数崩溃
- 使用std::enable_shared_from_this时,析构函数崩溃
- 定义_CRT_SECURE_NO_WARNINGS会导致vector析构函数崩溃