在我的项目中,我有一个事件系统。您可以将回调连接到事件,并且只要发送事件,就会调用您的回调。
连接到事件后,您将获得一个令牌。只要令牌没有被破坏,连接就处于活动状态:
class A
{
A()
{
event_connection = get_dispatcher().connect(event, std::bind(member_function, this));
}
void member_function()
{
dummy_instance++; //any action that uses this field
}
// changed from shared to unique to avoid confusion
//std::shared_ptr<event_connection_token> event_connection;
std::unique_ptr<event_connection_token> event_connection;
dummy_type dummy_instance;
}
但是,在以下场景中会出现问题:
- 解构类
A
开始 - 场
dummy_instance
被破坏 - 现在事件发生了
- 调用回调是因为
event_connection
尚未销毁 - 回调尝试访问释放的内存,程序崩溃
因此,我需要event_connection_token
始终在回调使用的任何类成员之前将其销毁。现在,如果我想让 100 位其他程序员使用这个事件回调系统,期望他们总是event_connection_token
首先在他们创建的所有类中释放分配是不专业的。我们终于来到了这个问题:
如何强制每个客户端event_connection_token
在客户端类中的其他任何内容被破坏之前删除?
我正在寻找:
- 一个聪明的设计,可以确保令牌总是在没有程序员考虑的情况下首先被删除,或者
- 编译时/运行时检查,让程序员知道他们需要修改代码以便首先删除令牌。
编辑:标记为重复的问题不能解决我的问题。我知道对象的破坏顺序,甚至明确调用.reset()
析构函数将解决我的问题。然而,这不是我的问题的解决方案。问题是我不想让项目中的每个开发人员都记住这条规则(因为这个事件回调系统将在代码中的许多地方使用)。