如果我有以下功能:
void MyFunctoin(int size){
// ...
int *arr=new int[size];
// ...
}
delete
?答案 0 :(得分:7)
标题问题的答案很简单:是的,每个new
必须与delete
匹配。在您的情况下,由于您使用了new[]
,因此某处必须有delete[]
。
但你不需要自己写。使用管理自己资源的类通常要好得多。在您的情况下,您最好使用STL容器,例如array<>
或vector<>
。这是:
std::array<int, size> arr; // fixed size (known at compile time)
或
std::vector<int> arr; // variable size
在vector
中,对new
和delete
的所有必要调用都在容器内完成,您无需关心它们。
你可以这样写你的功能:
#include <vector>
void MyFunctoin(int size){
// ...
std::vector<int> arr(size);
// ...
}
并且不会有任何内存泄漏,无需在任何地方调用delete
。如果您不想构建size
,则无需指定arr
。
答案 1 :(得分:6)
是的,确实如此。在您的情况下使用smart pointers
/ STL containers
(例如std::vector
/ boost::shared_array
/ std::unique_ptr<T[]>
。
答案 2 :(得分:2)
如果arr = new
之后的...部分不包含delete [] arr
,则会发生泄漏,是的。
解决方案是在适当的位置添加delete [] arr
,或使用vector<int> arr(size);
或unique_ptr<int[]> arr(new int[size])
。
哪种“正确”的选择实际上取决于您的整体目标。
答案 3 :(得分:1)
是。但你可以使用下面的智能指针摆脱它:
std::unique_ptr<int[]> arr (new int[size]);
答案 4 :(得分:0)
是。您需要将每个new
与delete
匹配,并将每个new[]
与delete[]
匹配。
有两种选择。第一种是使用垃圾收集库,例如众所周知的Boehm GC。
第二个更好的解决方案是使用智能指针。这些会在适当的时候为您拨打delete
。 C ++标准库中有一对,Boost有更多内容可以涵盖几乎所有可能的用例。
答案 5 :(得分:0)
正如已经指出的那样,所有new
必须在某处匹配delete
。智能指针可以方便地为您处理。
此处可能适用的另一个非C ++解决方案是不使用new
,而是使用标准C库中的alloca
。这样更轻量级,您无需取消分配,但当然size
变得太大时,您可能会炸毁堆栈。
答案 6 :(得分:0)
是
使用智能指针
template<class C> struct smartpointer
{
C* data;
smartpointer():data(NULL){}
~smartpointer(){if(data){delete data;data=NULL;}
};
当块过期时会自动销毁其内容