何时从C ++中删除堆中的对象?

时间:2012-05-27 22:22:28

标签: c++

我在C ++中从堆中删除对象时有点困惑。

当:

如果你正在执行一个相对较短的程序,计算一些东西,然后将标准输出传递给控制台,是否值得在控制台输出结果后销毁所有对象,否则程序会在退出时自动销毁?在大型程序的情况下,我认为当你不再需要任何物体时尝试锻炼肯定是更好的做法吗?

如何:

如果我有一个包含指向MyClass对象的指针的向量,一旦我完成了向量(和MyClass对象),我该如何编写一个可以销毁向量指向的所有MyClass对象的析构函数? (显然我也需要销毁这个载体)。

4 个答案:

答案 0 :(得分:4)

这是一个非常简单的合同 - 所有编程中最简单的合同之一:如果您分配了一个您承诺使用API​​的资源,那么您将适当地释放它。

不这样做 会产生负面影响。从浪费堆空间到nasal demons咀嚼你的内脏。

事实上,没有理由不释放你所要求的资源。不这样做是草率的,我会认为它代表了一般糟糕的代码质量(因为它!)。

此外,C ++非常容易不必做出这个决定:只是不生产垃圾,那么你就不需要清理了。不要分配freestore内存,或者你必须使用智能指针或特殊分配器来管理它。

如果你正确地使用C ++,那么就没有令人信服的技术理由让人对资源充满信心,并且有足够的动力去关注。

至于“如何”,我首先质疑存储指针的决定:原始C ++指针不应该拥有内存。如果你真的需要freestore内存,请使用智能指针,或者(最好)使用自动对象:因为它们位于向量中,这已经为您提供了所有权和存储位置,而向量类自动处理该内存。

如果您需要多态对象,遗憾的是需要来存储指针。在这种情况下,有几种可能性,但最简单的可能是使用智能指针。

答案 1 :(得分:1)

如果在完成对象后不销毁对象,则会导致内存/资源泄漏。如果你丢失了对象的踪迹,那么你就会有泄漏。

这是长时间运行的程序中的问题,因为您可能会耗尽内存或资源。如果没有正确跟踪对象,那么任何程序都是不好的标志。你制造了这个物体,你为什么不能摧毁它呢?

大多数(每个?)操作系统将在进程退出时从进程中回收已分配的内存,因此您无需自行整理。在某些情况下,避免这种毫无意义的整理可能意味着您的用户在您的流程完成时不会等待太长时间。

如果您的程序行为如此,则会使您的代码无法重复使用。如果要将其打包到库中,则必须处理此问题,因为您无法提前知道如何使用库。

至于你的指针向量:迭代向量并在每个指针上调用delete。然后摧毁矢量。

答案 2 :(得分:1)

  

如何编写可以销毁向量指向的所有MyClass对象的析构函数?

非常好的问题!具有这种析构函数的类称为智能指针,它们由Boost,TR1和C ++ 11标准库等库提供,其中至少有一个可能与您的平台一起提供。

您几乎不应该直接使用new T。使用unique_ptr<T>获得直接所有权(当且仅当向量仍然存在时,对象仍然存在)或shared_ptr<T>用于共享所有权。这些模板存在于命名空间boost::std::tr1::std::中,具体取决于您获取它们的方式。在任何情况下,接口都是相同的。

当然,如果你能避免它,你根本不应该使用任何类型的指针。 vector<T>优于vector< unique_ptr< T > >任何一天。

至于是否在退出之前释放资源,当然你应该。优秀的C ++实践使得忽略释放资源比正确处理事务更加困难,因此我们并不担心这一点。

答案 3 :(得分:-3)

对于短期运行的程序,可以不删除对象。没有不良后果。

但精心设计的应用程序代码是可重用的,可重用的代码基本上是库代码。库代码应删除它分配的对象,因为它可能在长时间运行的程序中使用。

换句话说,不要担心它会丢掉一个小程序。但是对于严肃的代码,删除对象而不是泄漏它们。