在指向同一对象的两个指针上调用delete

时间:2010-07-14 11:13:58

标签: c++ pointers new-operator delete-operator

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

我编写了代码,以便将事件放在堆栈上(堆栈在用户创建的结构中;事件本身使用new)和{{1}分配在读取信息并对其采取行动后。这给了我一些问题,因为在一个案例中,事件是由三个处理程序链发送的。比方说,deleteHandlerA发送new Event,将其放在堆栈上并读取它,将其发送到HandlerBHandlerC读取它并执行它需要执行的任何操作之后它delete是事件指针并将其设置为NULL。现在,我们回到HandlerB,而且,它还希望deleteNULL指向事件的指针。但是指针是局部变量,它最终会删除相同的地址两次,从而产生异常。

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

3 个答案:

答案 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)收到需要转发到另一个处理程序的事件时,它会创建一个新事件,而不是将指针传递给现有事件。

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