我是否需要对C++中的每个新内容使用删除
Do I need to use delete for each new in C++?
如果我有一个这样的函数:
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]);
是的。您需要将每个new
与delete
匹配,并将每个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;}
};
当块过期时,这会自动销毁其内容
- 如何逐行读取文件,每行中的内容都用空格分隔并将其写入新文件中
- 为什么缓冲区的内容在读取空 rdbuf 时被删除?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 如何在输入新内容 c++ 之前删除文件中的所有内容
- 根据新的行分隔符从字符串中删除子字符串
- ifstream在OSX上看不到新内容
- 不匹配新[]和删除,为什么没有内存泄漏
- 通过文本内容删除qlistwidget项目
- 有没有一种方法可以全局填充新分配/删除分配
- C++不允许堆栈实例,但允许新的删除
- 使用Dynamic Lib使用全局新和删除
- 如果新内容过载但未加载相应的删除,会发生什么情况
- 不完整类型的新内容在包装在模板中时编译
- 我是否需要对C++中的每个新内容使用删除
- 通过工厂设计模式向客户隐藏新内容的优势是什么
- C++ 单个指针上的多个新内容
- 如何删除shared_ptr内容并将其替换为新对象
- 与将新内容分配给向量的指针斗争
- 将static_cast<字符 *>malloc/free/free转换为新的/删除
- 为什么不使用模板实现新内容?