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

Do I need to use delete for each new in C++?

本文关键字:新内容 删除 是否 C++      更新时间:2023-10-16

如果我有一个这样的函数:

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

标题问题的答案很简单:是的,每个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。如果您不想,则无需在构造arr时指定size

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

如果...

arr = new后部分不包含delete [] arr,是的。

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

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

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

std::unique_ptr<int[]> arr (new int[size]);

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

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

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

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

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

是的。

使用智能指针

template<class C> struct smartpointer
{
    C* data;
    smartpointer():data(NULL){}
    ~smartpointer(){if(data){delete data;data=NULL;}
};

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