如果我使用new
运算符在方法中创建这样的对象:
void functionA(){
ClassA *a = new ClassA();
}
我是否需要使用以下代码来发布它?
delete a;
c ++可以自动释放ClassA对象的内存吗?当它用完功能范围时。
如果我写这样的代码
void functionA(){
ClassA a = ClassA();
}
会自动发布吗?
答案 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