我是否需要在 c++ 中从本地指针中释放分配的内存?

Do i need to free allocated memory from local pointers in c++?

本文关键字:释放 指针 分配 内存 是否 c++      更新时间:2023-10-16
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 容器或智能指针(实际上不是指针,而是类(来管理内存。标准库提供开箱即用的这些。此外,避免在不需要时进行动态分配。

几乎不需要直接使用newdelete,应尽可能避免使用。

C++没有垃圾回收器。如果使用new运算符动态分配内存,则必须使用delete运算符释放内存。

因此,如果分配的内存:

int *ptr = new int;

在退出函数之前未释放。

您可以使用智能指针来避免此类问题,例如std::unique_ptr,例如:

#include <memory>
//...
void f() {
std::unique_ptr<int> ptr = std::make_unique<int>();
//...
}