什么是在c ++中释放内存的最佳方法

时间:2011-08-23 09:08:24

标签: c++ pointers memory-management

我在C ++中使用类和嵌套类。我有很多类和嵌套类。我不知道什么时候应该释放内存。是否有一个软件可以显示何时何地从类中释放指针?

任何人都可以帮助我吗? THX

我想提一下,我在ubuntu下使用c ++。我的文件是.cpp和.h文件。没有主要的。 我正在使用class * x = new class()。我没有删除x因为我不知道我应该什么时候删除它。

6 个答案:

答案 0 :(得分:4)

释放内存的最佳方法不是明确释放它,而是使用自动变量。 (在C ++中,您不必动态分配所有内容)

MyClass obj; // it gets deallocated automatically

如果您需要使用动态内存分配(使用new()),那么最好的方法是使用smart pointers(它们也是自动对象并负责delete内存尖)。

否则,如果您确定已完成delete p;,则应使用p取消分配。

答案 1 :(得分:4)

设计软件系统的人应该知道对象的生命周期,否则事情很可能迟早会出错。这意味着您需要考虑需要多长时间(谁使用它)。与此同时,您需要知道谁拥有该对象。这两件事将告诉您如何创建对象

了解对象的生命周期及其所有权将告诉您是否需要堆栈或堆上的对象。前者,自动变量,您声明如下:

{
    ...
    SomeClass sc; 
    ...
} // sc will be destroyed here as it goes out of scope
如果仅在该范围内需要sc,则

是首选

如果使用new在堆上分配对象,则应该有理由这样做。例如。它们与其他对象共享,或者API要求您传递某个智能指针。

SomeObject* so = new SomeObject;

写上面的内容意味着你必须自己处理释放,不推荐!使用智能指针这样就可以了以这样的方式清理:

{
    ...
    boost::scoped_ptr<SomeObject> so(new SomeObject);
    ...
} // boost::scoped_ptr will automatically handle deallocation here

如果您将上述内容更改为boost::shared_ptr

{
    AnotherObject another;
    ...
    {
        ...
        boost::shared_ptr<SomeObject> so(new SomeObject);
        another.setObject(so); // sets so in another
        ...
    } // no deallocation of so here because another has a reference to it!!
} // when another goes out of scope (destroyed) so will be destroyed as well

一个shared_ptr可能超出范围,但它拥有的对象仍然存在,因为另一个对象具有对它的引用。如果您有许多使用某些资源并且您希望只要用户还活着就可以使用该资源,这可能非常方便。

简而言之,尽可能多地使用自动变量,并在需要时使用boost::scoped_ptrboost::shared_ptr等智能指针。

答案 2 :(得分:4)

答案 3 :(得分:1)

解除内存释放的最佳方法不是手动执行,而是使用 RAII/SBRM ,其中,每个资源本身负责释放它获取的资源。

使用智能指针。

答案 4 :(得分:1)

在C ++中,分配动态内存时非常重要的概念是所有权。当不再需要对象时,所有者负责delete对象。将指针作为函数参数或返回值传递时,记录所有权是否已转移至关重要:

class Foo {
public:
    void setHandler(Handler* handler);
    Bar* getBar();
};

Foo::setHandler()取得给定处理程序的所有权吗?如果是这样, Foo 的任务是确保在某个时刻删除该对象。否则,呼叫者将保留所有者。

同样,Foo::getBar()的用户是应该删除它收到的Bar*,还是会Foo继续拥有它?

答案 5 :(得分:0)

知道何时删除指针非常困难。使用智能指针为您完成工作,boost::shared_ptr显然是开始寻找的地方,