C ++删除一个对象

时间:2011-11-29 12:31:02

标签: c++ memory-management new-operator

我在处理C ++程序中的内存方面没有经验,所以在这种情况下我想要一条建议:

我想在类中的函数中创建new Object,这对于程序结束至关重要。就我而言,如果我使用运算符new,我有时应该删除它。考虑到它必须在一个类中初始化,我何时以及如何最终删除它?

4 个答案:

答案 0 :(得分:5)

我建议使用智能指针习惯用法

#include <memory>

struct X 
{
     void foo() { }
};

std::share_ptr<X> makeX() // could also be a class member of course
{
    return std::make_shared<X>();
}

int main()
{
     std::share_ptr<X> stayaround = makeX();

     // can just be used like an ordinary pointer:

     stayaround->foo();

     // auto-deletes <sup>1</sup>
}

如果指针确实是一个静态变量,你可以替换unique_ptr(它的工作方式类似,但在赋值时传递所有权;这意味着指针不必保持引用计数< / em>的)

注意 要了解有关C ++智能指针的更多信息,请参阅 smart pointers (boost) explained

注意 如果你没有TR1 / C ++ 0x支持,你可以使用Boost Smartpointer


<子> 1 除非您泄漏 shared_ptr本身的副本;这将是以前看不见的智能指针的奇怪用法:)

答案 1 :(得分:2)

您可以使用Sehe建议的智能指针,或者您可以在函数中创建静态对象并返回对它的引用。您无需明确删除该对象,当进程终止时该对象将被删除。像:

struct X {};

X& makeX() // could also be a class member of course
{
    static X x;
    return x;
}

int main()
{
     X& stayaround = makeX();
}

答案 2 :(得分:1)

编辑:使用某种智能指针通常是一个好主意,但我相信在C ++中对手动内存管理有充分的了解仍然是必不可少的。

如果希望类中的对象持续到程序结束,则可以简单地将其作为成员变量。根据您的说法,没有任何迹象表明您需要在此使用newdelete,只需将其设为自动变量即可。如果您确实希望使用newdelete进行练习,则应该阅读构造函数析构函数以获取类(您可以并且将会在课堂外使用newdelete,但我试图将此问题与您的问题保持一致。这是我之前准备的一个:

class Foo
{
    public:
        Foo();  // Default constructor.
        ~Foo(); // Destructor.

    private:
        int *member;
}

Foo::Foo() // Default constructor definition.
{
    member = new int; // Creating a new int on the heap.
}

Foo::~Foo() // Destructor.
{
    delete member; // Free up the memory that was allocated in the constructor.
}

这是一个简单的例子,但它有望帮助你。请注意,只要对象处于活动状态,变量将仅保留。如果对象被销毁或超出范围,则将调用析构函数并释放内存。

答案 3 :(得分:0)

在大多数操作系统(特别是Linux)上,如果您使用new Object分配对象指针,并且不打扰delete - 因为您需要它直到程序结束,否伤害确实完成了。程序内部存在一些内存泄漏(您可以使用valgrind来查找此类泄漏)但内核将释放进程结束时使用的所有内存。

更好的选择是为应用程序数据提供单例类,例如在Qt QApplication中,ahd在main的早期在该类中构造了一个实例,并让该类包含指向Object的智能或哑指针。析构函数应该delete该对象。