2

如果我有这样的功能:

void MyFunctoin(int size){
// ...
int *arr=new int[size];
// ...
}
  • 有内存泄漏吗?
  • 如果是,有没有办法在不使用的情况下解决它delete
4

7 回答 7

7

您的标题问题的答案很简单:是的,每个都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所有必要调用都在容器内完成,您无需关心它们。newdelete

你可以这样写你的函数:

#include <vector>

void MyFunctoin(int size){
  // ...
  std::vector<int> arr(size);
  // ...
}

并且不会有任何内存泄漏,无需在delete任何地方调用。如果您不想size在构建时指定,则无需指定。arr

于 2013-10-28T08:08:01.863 回答
6

是的。使用smart pointers/ STL containers(例如std::vector/ boost::shared_array/std::unique_ptr<T[]>在你的情况下)。

于 2013-10-28T08:02:52.910 回答
2

如果 ... 之后的部分arr = new不包含 a ,则存在泄漏delete [] arr,是的。

解决方案是delete [] arr在合适的位置添加 a ,或者使用vector<int> arr(size);, 或unique_ptr<int[]> arr(new int[size])

哪个是“正确”的选择实际上取决于您总体上要实现的目标。

于 2013-10-28T08:07:07.653 回答
1

是的。但您可以使用下面的智能指针来摆脱它:

std::unique_ptr<int[]> arr (new int[size]);
于 2013-10-28T08:05:59.350 回答
0

是的。

使用智能指针

template<class C> struct smartpointer
{

    C* data;
    smartpointer():data(NULL){}
    ~smartpointer(){if(data){delete data;data=NULL;}

};

这会在块过期时自动销毁其内容

于 2013-10-28T11:27:04.587 回答
0

正如已经指出的,所有news 必须在delete某处匹配 s。智能指针可以方便地为您处理这个问题。

另一个可能适用于此处的非 C++ 解决方案是不使用new,而是alloca来自标准 C 库。这是更轻量级的,你不必解除分配,但当然,如果堆栈size太大,你可以炸毁堆栈。

于 2013-10-28T08:21:53.380 回答
0

是的。您需要将每个new与一个匹配delete,并且每个new[]与一个匹配delete[]

有两种选择。第一种是使用垃圾收集库,例如著名的Boehm GC

第二个更好的解决方案是使用智能指针。这些将delete在适当的时候召唤您。C++ 标准库中有几个,而 Boost 有更多内容,几乎涵盖了所有可能的用例。

于 2013-10-28T08:06:08.070 回答