5

我正在尝试编写的几个事件处理程序类有问题。基本上,这个想法是为每个逻辑对象组创建一个事件处理程序类。在大多数情况下,事件发生在对象及其处理程序之间,但在某些情况下,事件也在处理程序对象之间发送。

我编写了代码,以便将事件放置在堆栈上(堆栈与用户创建的结构一样;事件本身是使用 分配的new)和deleted 在读取并执行其信息后。这给我带来了一些问题,因为在一种情况下,事件是沿着三个处理程序的链发送的。比如说,HandlerA发送一个new Eventto HandlerB,它将它放在堆栈上并读取它,将它发送到HandlerC,它读取它并执行它需要执行的任何操作,然后它delete是 Event 指针并将其设置为NULL。现在,我们回到HandlerB并且,好吧,它也想deleteNULL指向事件的指针。但是指针是一个局部变量,它最终会删除两次相同的地址,从而引发异常。

你怎么解决这个问题?您是否需要使用其中一个花哨auto_ptr的 s(在这里仍然是早期学习者),还是我在这里缺少一些基本的东西?

4

3 回答 3

10

我编写了代码,以便将事件放在堆栈上,并在读取并执行其信息后将其删除。

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

通常,您应该为堆上的对象定义明确的所有权策略。每个对象都应该有一个所有者,并且在任何时候都应该清楚所有者是谁。那个所有者——而且只有它自己——应该delete是对象。

您可能还想使用(根据您的编译器,boost::shared_ptr它可能也可以用作)而不是原始指针。std::tr1::shared_ptr这会保持对对象的引用计数,并delete在引用计数降至 0 时对其进行计数。

于 2010-07-14T11:16:54.497 回答
6

您想要的是一些指针包装器,用于实例使用引用计数来检查其他变量是否引用同一个实例。这个想法是,指针指向的对象仅在该对象未被任何其他指针使用时才被释放。这类指针通常被称为智能指针。例如,在 c++ 中,您可以使用Boost提供的那些。

于 2010-07-14T11:18:10.477 回答
1

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

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

于 2010-07-14T11:30:01.723 回答