2013-06-06 206 views
0

如果我使用new操作的方法来创建这样一个对象:我是否需要删除对象?

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

我需要使用下面的代码来释放它?

delete a; 

C++能否自动释放ClassA对象的内存?当它用完了functionA范围。

如果我写这样

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

代码做了自动退出?

+6

这是回答在任何好的[初学者书](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 – GManNickG

+0

我认为是的,因为C++没有自动垃圾回收 – pinkpanther

+0

@pinkpanther,它的确称为RAII。而且C++ 11支持GC。 – chris

回答

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,如果你正确地定义它的析构函数会得到 '释放' 自动。如果在ClassA析构函数中没有正确清理,那么a内的某个字段仍然可能会泄漏。

+0

请注意,Class a = ClassA()的语义几乎肯定与OP期望的不同。 –

3

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

是的,你必须发布每个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(); 
} 

代码做了自动退出?

是的,它的确如此。

1

您可以使用std::unique_ptr自动做到这一点:

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

是的,你需要删除的任何动态分配的原始指针。如果您想在超出范围时自动销毁它,可以在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 
3
void functionA(){ 
    ClassA a = ClassA(); 
} 

呃,为什么还要写呢?它效率低下,令人困惑并且完全没有必要。有什么不对:

void functionA() { 
    ClassA a; 
} 

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

相关问题