0

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

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

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

   delete a;

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

如果我写这样的代码

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

会自动释放吗?

4

5 回答 5

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

于 2013-06-06T05:14:22.000 回答
3

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

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

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

您可以使用智能指针

#include <memory>

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

a_ptr一旦a_ptr超出范围,分配的内存将自动释放。

如果我写这样的代码

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

会自动释放吗?

是的,它确实。

于 2013-06-06T05:17:23.330 回答
3
void functionA(){
    ClassA a = ClassA();
}

嗯,为什么要写这个?它效率低下,令人困惑且完全没有必要。有什么问题:

void functionA() {
    ClassA a;
}

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

于 2013-06-06T05:19:12.893 回答
1

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

void functionA() {
    std::unique_ptr<ClassA> a(new ClassA());
    // don't release
}
于 2013-06-06T05:17:47.777 回答
1

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

 [1]: http://www.cplusplus.com/reference/memory/unique_ptr/
 [2]: http://www.cplusplus.com/reference/memory/shared_ptr/
 [3]: http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/scoped_ptr.htm
于 2013-06-06T05:17:57.733 回答