如何防止 signals2::scoped_connection 在 disconnect() 中中止?
How can I prevent signals2::scoped_connection from aborting in disconnect()?
我正在使用 boost::signals2,但遇到连接管理问题。我将 scoped_connections 存储在稍后修剪的列表中。但是,我发现如果拥有关联信号的对象已被销毁,scoped_connection::disconnect() 将中止,因为它的几个字段现在无效。
signals2::connection conn =
client->connectRequest( RequestSignal::slot_type(
bind( &Manager::requestRefresh, this, _1 ) ).track( client ) );
mClients.push_back( ClientConnection( client, conn ) );
客户端连接:
struct ClientConnection
{
weak_ptr<Client> client;
signals2::scoped_connection* connection;
ClientConnection( weak_ptr<Client> aClient, signals2::connection aConnection )
{
client = aClient;
connection = new signals2::scoped_connection( aConnection );
}
~ClientConnection()
{
delete connection;
}
}
管理器 class 拥有这些 ClientConnections 的列表,并定期迭代并尝试删除它无法从中获取客户端合法 shared_ptr 的条目。我现在了解到 track() 不会像我想象的那样在其对象过期时断开连接;它只是阻止信号发射。当客户端超出范围时,scoped_connection 最终指向一堆坏内存,我最终在执行 disconnect() 时预取或数据中止。
signals2 API 中是否有我忽略的可以纠正此问题的内容?还是我必须重新考虑我的连接管理?我知道必须从这一端保持与客户端信号的连接似乎很奇怪,但客户端使用的流可能会超出范围,因此在这种情况下,我需要断开管理器插槽与客户端的连接。
事实证明这是一个对象生命周期问题,而不是 signals2 问题。我使用了一个指向作用域连接的原始指针来绕过它的不可复制 属性。但我忽略的是,当结构被复制构造为插入到列表中时,原始结构被破坏,这删除了指针的内存...
将其更改为共享指针解决了这个问题。
我正在使用 boost::signals2,但遇到连接管理问题。我将 scoped_connections 存储在稍后修剪的列表中。但是,我发现如果拥有关联信号的对象已被销毁,scoped_connection::disconnect() 将中止,因为它的几个字段现在无效。
signals2::connection conn =
client->connectRequest( RequestSignal::slot_type(
bind( &Manager::requestRefresh, this, _1 ) ).track( client ) );
mClients.push_back( ClientConnection( client, conn ) );
客户端连接:
struct ClientConnection
{
weak_ptr<Client> client;
signals2::scoped_connection* connection;
ClientConnection( weak_ptr<Client> aClient, signals2::connection aConnection )
{
client = aClient;
connection = new signals2::scoped_connection( aConnection );
}
~ClientConnection()
{
delete connection;
}
}
管理器 class 拥有这些 ClientConnections 的列表,并定期迭代并尝试删除它无法从中获取客户端合法 shared_ptr 的条目。我现在了解到 track() 不会像我想象的那样在其对象过期时断开连接;它只是阻止信号发射。当客户端超出范围时,scoped_connection 最终指向一堆坏内存,我最终在执行 disconnect() 时预取或数据中止。
signals2 API 中是否有我忽略的可以纠正此问题的内容?还是我必须重新考虑我的连接管理?我知道必须从这一端保持与客户端信号的连接似乎很奇怪,但客户端使用的流可能会超出范围,因此在这种情况下,我需要断开管理器插槽与客户端的连接。
事实证明这是一个对象生命周期问题,而不是 signals2 问题。我使用了一个指向作用域连接的原始指针来绕过它的不可复制 属性。但我忽略的是,当结构被复制构造为插入到列表中时,原始结构被破坏,这删除了指针的内存...
将其更改为共享指针解决了这个问题。