如果我有这样的功能:
void MyFunctoin(int size){
// ...
int *arr=new int[size];
// ...
}
- 有内存泄漏吗?
- 如果是,有没有办法在不使用的情况下解决它
delete
?
如果我有这样的功能:
void MyFunctoin(int size){
// ...
int *arr=new int[size];
// ...
}
delete
?您的标题问题的答案很简单:是的,每个都new
必须由 a 匹配delete
。就您而言,既然您使用new[]
了 ,则必须有一个delete[]
地方。
但是你不需要自己写。使用管理自己的资源的类通常要好得多。在您的情况下,您最好使用 STL 容器,例如array<>
or 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
是的。使用smart pointers
/ STL containers
(例如std::vector
/ boost::shared_array
/std::unique_ptr<T[]>
在你的情况下)。
如果 ... 之后的部分arr = new
不包含 a ,则存在泄漏delete [] arr
,是的。
解决方案是delete [] arr
在合适的位置添加 a ,或者使用vector<int> arr(size);
, 或unique_ptr<int[]> arr(new int[size])
。
哪个是“正确”的选择实际上取决于您总体上要实现的目标。
是的。但您可以使用下面的智能指针来摆脱它:
std::unique_ptr<int[]> arr (new int[size]);
是的。
使用智能指针
template<class C> struct smartpointer
{
C* data;
smartpointer():data(NULL){}
~smartpointer(){if(data){delete data;data=NULL;}
};
这会在块过期时自动销毁其内容
正如已经指出的,所有new
s 必须在delete
某处匹配 s。智能指针可以方便地为您处理这个问题。
另一个可能适用于此处的非 C++ 解决方案是不使用new
,而是alloca
来自标准 C 库。这是更轻量级的,你不必解除分配,但当然,如果堆栈size
太大,你可以炸毁堆栈。
是的。您需要将每个new
与一个匹配delete
,并且每个new[]
与一个匹配delete[]
。
有两种选择。第一种是使用垃圾收集库,例如著名的Boehm GC。
第二个更好的解决方案是使用智能指针。这些将delete
在适当的时候召唤您。C++ 标准库中有几个,而 Boost 有更多内容,几乎涵盖了所有可能的用例。