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

C++中调用Bar(new Foo(1,2))是否会导致内存泄漏?附检测建议

问题解答

1. C++中Bar(new Foo(1, 2))会造成内存泄漏吗?

是的,这段代码必然会导致内存泄漏。原因很明确:

  • 用new Foo(1,2)在堆上分配的Foo对象内存,没有被保存到任何变量中;
  • Bar函数仅接收指针并访问对象成员,没有(也无法)负责释放这块内存;函数执行完毕后,再也没有途径获取该指针来调用delete,堆内存会一直占用直到程序退出。

正确的替代写法

写法一:值传递(推荐,简单安全)

修改Bar的参数为值传递,直接创建临时栈对象传递,无需手动管理内存:

#include <iostream>
using namespace std;

struct Foo
{
    int a;
    int b;
    Foo(int a, int b) : a(a), b(b) {} // 初始化列表更符合C++规范
};

void Bar(Foo obj) // 值传递参数
{
    cout << obj.a << ":" << obj.b << endl; 
}

int main(int argc, char** argv)
{
    Bar(Foo(1, 2)); // 临时栈对象,离开作用域自动销毁
    return 0;
}

写法二:智能指针(适合必须用指针的场景)

如果Bar必须接收指针,改用std::unique_ptr自动管理内存,从根源避免泄漏:

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

struct Foo
{
    int a;
    int b;
    Foo(int a, int b) : a(a), b(b) {}
};

void Bar(const unique_ptr<Foo>& obj) // 接收智能指针的引用
{
    cout << obj->a << ":" << obj->b << endl; 
}

int main(int argc, char** argv)
{
    Bar(make_unique<Foo>(1, 2)); // make_unique自动创建并管理对象,离开作用域自动释放
    return 0;
}

2. Windows 10下g++环境的内存泄漏检测工具建议

针对MinGW/MinGW-w64的g++环境,推荐两种实用方案:

  • AddressSanitizer:g++原生支持的内存检测工具,编译时添加参数-fsanitize=address -g,运行生成的程序后,会自动输出内存泄漏、越界访问等问题的详细信息。
  • Dr.Memory:跨平台内存检测工具,支持Windows系统,可检测内存泄漏、使用已释放内存等问题。只需将编译生成的可执行文件拖入Dr.Memory运行界面,或通过命令行执行drmemory.exe -- your_program.exe,即可生成详细检测报告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:40:52