我是否需要对C ++中的每个新用途使用删除?

时间:2013-10-28 08:02:09

标签: c++ memory-leaks

如果我有以下功能:

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

7 个答案:

答案 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中,对newdelete的所有必要调用都在容器内完成,您无需关心它们。

你可以这样写你的功能:

#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)

是。您需要将每个newdelete匹配,并将每个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;}

};

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