You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

void函数内堆内存未释放是否会泄漏?教材与ChatGPT说法矛盾求解

关于这段C++代码的内存泄漏问题解答

这段代码确实存在内存泄漏,你的理解是正确的,教材的说法有误。

核心原因:

  • 代码中通过new int(5)在堆(自由存储区)上分配了一块内存,用于存储值为5的int变量。
  • 指针pVar是FuncOne函数的局部变量,当函数执行完毕后,pVar会被销毁,但它指向的堆内存并未被释放——此时程序已经失去了指向这块内存的所有引用,再也无法通过delete操作回收它。
  • 虽然操作系统会在进程结束后自动回收所有进程占用的内存,但这属于进程退出后的系统级清理,不能否定程序运行期间发生了内存泄漏。如果这段函数被多次调用(比如放入循环中),堆内存会持续被占用且无法释放,最终可能导致内存耗尽。

正确的修正方式:

你可以在使用完指针后手动释放内存:

void FuncOne() {
    int* pVar = new int(5);
    std::cout << "the value of *pVar is:" << *pVar;
    delete pVar; // 释放堆内存
}

或者更推荐使用C++智能指针来自动管理内存,避免手动操作的失误:

#include<iostream>
#include<memory> // 包含智能指针头文件

void FuncOne() {
    std::unique_ptr<int> pVar = std::make_unique<int>(5);
    std::cout << "the value of *pVar is:" << *pVar;
    // 无需手动delete,智能指针会在作用域结束时自动释放内存
}

内容的提问来源于stack exchange,提问作者Issac Howard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:22:02