如果我使用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
,如果你正确地定义它的析构函数会得到 '释放' 自动。如果在ClassA
析构函数中没有正确清理,那么a
内的某个字段仍然可能会泄漏。
请注意,Class a = ClassA()的语义几乎肯定与OP期望的不同。 –
我是否需要使用以下代码才能发布它?
是的,你必须发布每个new
ed对象。
C++能否自动释放ClassA对象的内存?
你可以使用智能指针:分配给a_ptr
#include <memory>
void functionA(){
std::unique_ptr<ClassA> a_ptr(new ClassA);
}
记忆将再次a_ptr
超出范围自动realeased。
如果我写这样
void functionA(){ ClassA a = ClassA(); }
代码做了自动退出?
是的,它的确如此。
您可以使用std::unique_ptr
自动做到这一点:
void functionA() {
std::unique_ptr<ClassA> a(new ClassA());
// don't release
}
是的,你需要删除的任何动态分配的原始指针。如果您想在超出范围时自动销毁它,可以在boost库中使用C++ 11标准中包含的一些智能指针,如[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
void functionA(){
ClassA a = ClassA();
}
呃,为什么还要写呢?它效率低下,令人困惑并且完全没有必要。有什么不对:
void functionA() {
ClassA a;
}
一般来说,如果你使用new
您必须使用delete
当你不再需要你用new
分配的实例。当然也有例外,但现在你不必担心它们。现在只要记住:如果你分配它,用new
你拥有它,并且必须用delete
释放它。
这是回答在任何好的[初学者书](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 – GManNickG
我认为是的,因为C++没有自动垃圾回收 – pinkpanther
@pinkpanther,它的确称为RAII。而且C++ 11支持GC。 – chris