void f() {
int *ptr = new int;
// is the following line necessary?
delete ptr;
}
int main() {
f();
return 0;
}
我是否必须释放函数 f 中分配的内存,还是因为不再引用该内存而自动释放?
在 c++ 中,我是否需要从本地指针中释放分配的内存?
如果你想避免内存泄漏 - 你应该想要 - 那么你应该分解你分配的所有内容。每个分配new
应该有一个delete
。
还是自动释放
动态分配不会自动释放。
因为不再引用该记忆了?
是否引用内存与是否解除分配内存无关紧要。如果动态内存未被任何内容引用,则内存已泄漏。C++没有垃圾回收。
某些类确实会分配内存并在其析构函数中释放该分配。这个成语被称为RAII(查找首字母缩写以了解更多信息(。指针不是类,它没有析构函数。指针生存期的结束对指向的对象没有影响。
应避免使用裸拥有指针。我建议使用 RAII 容器或智能指针(实际上不是指针,而是类(来管理内存。标准库提供开箱即用的这些。此外,避免在不需要时进行动态分配。
几乎不需要直接使用new
和delete
,应尽可能避免使用。
C++没有垃圾回收器。如果使用new
运算符动态分配内存,则必须使用delete
运算符释放内存。
因此,如果分配的内存:
int *ptr = new int;
在退出函数之前未释放。
您可以使用智能指针来避免此类问题,例如std::unique_ptr
,例如:
#include <memory>
//...
void f() {
std::unique_ptr<int> ptr = std::make_unique<int>();
//...
}