我正在尝试编写几个事件处理程序类的问题。基本上,我们的想法是为每个逻辑对象组创建一个事件处理程序类。在大多数情况下,事件是在对象和它们的处理程序之间,但在某些情况下,事件也在处理程序对象之间发送。
我编写了代码,以便将事件放在堆栈上(堆栈在用户创建的结构中;事件本身使用new
)和{{1}分配在读取信息并对其采取行动后。这给了我一些问题,因为在一个案例中,事件是由三个处理程序链发送的。比方说,delete
向HandlerA
发送new Event
,将其放在堆栈上并读取它,将其发送到HandlerB
,HandlerC
读取它并执行它需要执行的任何操作之后它delete
是事件指针并将其设置为NULL
。现在,我们回到HandlerB
,而且,它还希望delete
和NULL
指向事件的指针。但是指针是局部变量,它最终会删除相同的地址两次,从而产生异常。
你是如何解决这个问题的?你需要使用那些花哨的auto_ptr
之一(这里还是早期的学习者),还是我错过了一些基本的东西?
答案 0 :(得分:10)
<击> 撞击>
<击>我编写了这样的代码,以便将事件放在堆栈上,并在读取信息并对其进行操作后删除。
这里有一些混乱 - 堆栈上的对象不为 delete
d。使用new
(在堆上)创建的对象应该。
通常,您应该为堆上的对象定义明确的所有权策略。每个对象应该有一个所有者,并且应该清楚所有者在任何时间点。那个拥有者 - 而且它本身 - 应该delete
对象。
您可能还想使用boost::shared_ptr
(它可能也可用作std::tr1::shared_ptr
,具体取决于您的编译器)而不是原始指针。这将保留对对象的引用计数,并在引用计数降为0时delete
。
答案 1 :(得分:6)
你想要的是一些指针包装器,实例使用引用计数来检查其他变量是否引用同一个实例。这个想法是,指针指向的对象仅在该对象未被任何其他指针使用时才被释放。这些指针通常被称为Smart Pointers。例如,在c ++中,您可以使用Boost提供的那些。
答案 2 :(得分:1)
我看到的问题是没有明确的指针所有者。一个解决方案将是inflagranti的答案中指出的智能指针。或者,您可以停止转发事件两次 - 当处理程序(示例中的处理程序B)收到需要转发到另一个处理程序的事件时,它会创建一个新事件,而不是将指针传递给现有事件。
那说;如果你愿意花时间研究它们,我认为智能指针解决方案可能更好!