何时使对象自行删除?

时间:2009-06-19 15:18:56

标签: c++ oop memory-management

Callback* p = new Callback;
function(p);

如果我想删除回调对象,何时以及如何删除它?

如果它被提前删除,那么回调可能会因分段错误而失败。

6 个答案:

答案 0 :(得分:17)

最好的解决方案是使用智能指针 使用回调初始化指针并将其传递给函数。当函数或任何进程完成时,智能指针将自动删除回调 一个好的智能指针实现是boost::shared_ptr<>

答案 1 :(得分:3)

如果代码与你设置的一样简单,意味着在执行func()之后只有一个对Callback指针的引用,我相信auto_ptr就足够了:

std::auto_ptr<Callback> p(new Callback);
func(p.get());

这也确保了如果func()抛出异常,内存仍将被释放。

答案 2 :(得分:1)

您可以使用回调时的递增/递减计数。使用时,递增计数,当不再使用时,递减计数。当它达到0或-1时释放它。

答案 3 :(得分:1)

假设func()是使用该特定Callback对象的唯一函数,并且该代码总是按照Callback对象的顺序执行,我会在调用func()之后将其放入。这样,如果你必须编辑func(),你不必担心Callback对象被删除的位置。它还确保所有指针都已清空,因为当函数完成时func()的指针应该已经停止存在,唯一要做的就是删除引用它的指针。

如果我对C ++中的指针的理解存在缺陷并导致我给出错误的答案,我道歉。我总是对此感到困惑。

答案 4 :(得分:1)

如果您的代码与您编写的代码一样简单,并且func()在某个时刻直接调用回调,那么这应该足够了:

Callback p;
func(&p);

但是,如果func()在其他位置保存了对回调的引用或指针,则需要跟踪该引用的生命周期。

答案 5 :(得分:0)

持有回调的“来电者”对象(执行回叫的回叫者)可能是正确的所有者(决定回调的生命周期,特别是使用delete取消回调的生命周期回调对象,用auto_ptr等保持它)当且仅当它的语义是让它确定什么时候不再需要进一步的回调 - 这是不可能从问题中提供的这些不足的信息中分辨出来的

您可能还需要创建回调的代码(并将其所有权传递给调用者支持者)以明确要求“调用者支持者”删除回调对象(和当所述代码确定不再需要回调时,不再执行回调。

其他答案提到比auto_ptr更聪明的指针来解决“谁拥有这个”的问题消失(提升的shared_ptr,手动引用计数,...) - 如果你这可能会很好由于其他原因而被迫使用C ++,但实际上是在使用垃圾收集语言,但是,如果你专门选择C ++是因为它可以完全控制内存使用,那么正确确定对象所有权和生命周期问题不是可选的(与任何类型的或多或少自动化的“垃圾收集”相比,它可以认真优化您的资源使用 - 当您需要密切控制您的资源使用时,这一点非常重要;-)。