如果我使用new
运算符在方法中创建这样的对象:
void functionA(){
ClassA *a = new ClassA();
}
我需要使用以下代码来发布它吗?
delete a;
c++可以自动释放ClassA对象的内存吗?当它用完 functionA 范围时。
如果我写这样的代码
void functionA(){
ClassA a = ClassA();
}
会自动释放吗?
如果我使用new
运算符在方法中创建这样的对象:
void functionA(){
ClassA *a = new ClassA();
}
我需要使用以下代码来发布它吗?
delete a;
c++可以自动释放ClassA对象的内存吗?当它用完 functionA 范围时。
如果我写这样的代码
void functionA(){
ClassA a = ClassA();
}
会自动释放吗?
为了:
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
我需要使用以下代码来发布它吗?
是的,您必须释放每个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(); }
会自动释放吗?
是的,它确实。
void functionA(){
ClassA a = ClassA();
}
嗯,为什么要写这个?它效率低下,令人困惑且完全没有必要。有什么问题:
void functionA() {
ClassA a;
}
一般来说,如果你使用new
你必须delete
在你不再需要你分配的实例时使用new
。当然,也有例外,但您现在不必担心它们。现在只需要记住:如果你分配了它,new
你就拥有它,并且必须用delete
.
您可以使用std::unique_ptr
自动执行此操作:
void functionA() {
std::unique_ptr<ClassA> a(new ClassA());
// don't release
}
是的,您需要删除任何动态分配的原始指针。如果要在超出范围时自动销毁它,可以使用 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