C++内存管理疑问:循环中*new int是否泄漏?如何正确释放内存?
C++内存泄漏问题解答
代码是否存在内存泄漏?
这段代码存在严重的内存泄漏。
原因:new int(25)会在堆上分配一块int大小的内存并初始化为25,返回指向该内存的指针。但你直接用*解引用把值赋给栈变量num,却没有保存new返回的指针地址——堆内存的唯一标识(指针)丢失后,程序再也无法定位到这块内存进行释放。循环执行200次,就会泄漏200块堆内存,直到程序退出才会被操作系统回收。
如何清理内存?
要解决这个问题,核心是保存new返回的指针,在使用完堆内存后用delete释放。同时满足你要求的*new int赋值方式,代码修改如下:
int main() { for(int i = 0;i < 200;i++) { int* ptr = new int(25); // 保存堆内存的指针 int num = *ptr; // 通过*new int的方式给num赋值 delete ptr; // 释放堆内存,避免泄漏 } }
为什么之前的delete/free无效?
delete必须接收new返回的内存地址才能释放对应堆内存,你之前没有保存指针,自然无法传入正确的地址。free是C语言中配合malloc使用的内存释放函数,C++中用new分配的内存必须用delete释放,不能混用free,而且同样需要指针地址。
更安全的写法(智能指针)
如果不想手动管理指针,可以用C++标准库的智能指针std::unique_ptr,它会在作用域结束时自动释放内存,避免遗忘delete:
#include <memory> int main() { for(int i = 0;i < 200;i++) { std::unique_ptr<int> ptr = std::make_unique<int>(25); int num = *ptr; // 无需手动调用delete,智能指针会自动清理内存 } }
内容的提问来源于stack exchange,提问作者Niraj
相关产品推荐
相关产品推荐

