2010-07-14 112 views
5

我正在尝试编写几个事件处理程序类。基本上,这个想法是为每个逻辑对象组创建一个事件处理程序类。在大多数情况下,事件在对象和它们的处理程序之间,但是在某些情况下,事件也在处理程序对象之间发送。调用删除两个指向同一对象的指针

我写这样的事件被放置在堆栈上的代码(如在用户创建的结构;本身使用new分配的事件)和delete d他们的信息被读出并采取行动之后。这给了我一些问题,因为在一个案例中,这个事件是由三个处理程序链发送的。假设,HandlerA发送一个new EventHandlerB,它将它放在堆栈上并将其读取,并将其发送到HandlerC,该文件将其读取并执行任何需要执行的操作,然后将其设置为NULL。现在,我们回到HandlerB,好吧,它也想要deleteNULL指向事件的指针。但是指针是一个局部变量,并且它最终删除了两次相同的地址,导致异常。

你如何解决这个问题?你是否需要使用其中一种花式auto_ptr(这里还是一个早期的学习者),还是我在这里错过了一些基本的东西?

+0

事件在堆栈上分配,或者它们在堆上分配(使用新的)并存储在堆栈数据结构中? – Naveen 2010-07-14 11:20:11

+0

使用new在堆上分配事件并将其存储在堆栈结构中。我想我应该改变上面的措辞...... – 2010-07-14 11:22:28

回答

10

我写这样的事件放置在堆栈上删除自己的信息被读取并采取行动后的代码。

这里有一些混乱 - 对象在栈上应该 delete d。用 new(在堆上)创建的对象应该。

通常,您应该为堆中的对象定义明确的所有权策略。每个物体应该有一个所有者,并且应该清楚所有者在任何时间点。该所有者 - 仅此 - 应为该对象的delete

您可能还想使用boost::shared_ptr(它也可能是std::tr1::shared_ptr,取决于您的编译器)而不是原始指针。这将保持对对象的引用的计数,并且当引用计数下降到0时,它就是delete

+0

我的意思是用户创建的堆栈结构,而不是你的意思。抱歉! – 2010-07-14 11:18:36

+0

我认为OP意味着一个堆栈数据结构,而不是堆栈。 – Jackson 2010-07-14 11:20:28

+0

@Kristian,我明白了,谢谢你的澄清。那么问题并不像它最初看起来那么糟糕:-) – 2010-07-14 11:20:57

6

想要的是某些指针包装器,例如使用引用计数来检查其他变量是否引用同一个实例。这个想法是,指针指向的对象只有在该对象没有被其他指针使用时才被释放。这些指针通常被称为Smart Pointers。在C++中,您可以使用Boost提供的那些。

1

我看到的问题是,没有明确的指针拥有者。正如inflagranti的回答中指出的那样,一种解决方案将是智能指针。或者,您可以停止两次转发事件 - 当一个处理程序(您的示例中的Handler B)接收到需要转发给另一个处理程序的事件时,它会创建一个新事件,而不是将指针传递给现有事件。

这就是说;如果您想花时间研究它们,我认为智能指针解决方案可能更好!