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
相关产品推荐
相关产品推荐

