我需要删除该对象吗?

时间:2013-06-06 05:10:43

标签: c++

如果我使用new运算符在方法中创建这样的对象:

void functionA(){
    ClassA *a = new ClassA();
}

我是否需要使用以下代码来发布它?

   delete a;

c ++可以自动释放ClassA对象的内存吗?当它用完功能范围时。

如果我写这样的代码

void functionA(){
    ClassA a = ClassA();
}

会自动发布吗?

5 个答案:

答案 0 :(得分:5)

有关:

void functionA() {
    ClassA *a = new ClassA();
}

您必须在函数内放置delete a;才能清除它:

void functionA() {
    ClassA *a = new ClassA();
    // your other code here
    delete a;
}

否则您将面临内存泄漏。这是除非您以某种方式返回a变量或将其传递给释放它的其他位置。

有关:

void functionA(){
    ClassA a = ClassA();
}
如果您正确定义其析构函数,

a将自动“释放”。如果在a析构函数中没有正确清理,ClassA内的某些字段仍有可能泄漏。

答案 1 :(得分:3)

  

我是否需要使用以下代码来发布它?

是的,您必须释放每个new ed对象。

  

c ++可以自动释放ClassA对象的内存吗?

您可以使用智能指针

#include <memory>

void functionA(){
    std::unique_ptr<ClassA> a_ptr(new ClassA);
}

a_ptr分配给a_ptr的内存将在void functionA(){ ClassA a = ClassA(); } 超出范围后自动重新发布。

  

如果我写这样的代码

{{1}}
     

会自动发布吗?

是的,确实如此。

答案 2 :(得分:3)

void functionA(){
    ClassA a = ClassA();
}
嗯,为什么写那个?这是低效的,令人困惑的,完全没必要的。出了什么问题:

void functionA() {
    ClassA a;
}

一般来说,如果您使用new,则在不再需要使用delete分配的实例时,必须使用new。当然也有例外,但你现在不需要担心它们。现在只需记住:如果您已将其分配,则new拥有它,并且必须使用delete取消分配。

答案 3 :(得分:1)

您可以使用std::unique_ptr自动执行此操作:

void functionA() {
    std::unique_ptr<ClassA> a(new ClassA());
    // don't release
}

答案 4 :(得分:1)

是的,您需要删除任何动态分配的原始指针。如果你想在超出范围时自动销毁它,你可以使用C ++ 11标准中包含的一些智能指针,如[shared_ptr] [1]或[unique_ptr] [2]或[{升级库中的{1}}] [3]:

scoped_ptr