C++函数中该代码是否会产生内存泄漏?
关于这段C++代码的内存泄漏问题解答
这段代码肯定会造成内存泄漏。
new object()会在堆上分配内存存储object对象,并把内存地址赋值给指针x。但直接将x设为nullptr后,程序丢失了这块堆内存的唯一引用,又没有调用delete x释放内存,操作系统无法自动回收这块内存(只有程序结束后才会被回收,运行期间始终被占用,属于内存泄漏)。局部作用域只会自动销毁指针变量
x本身(它是栈上的局部变量),但它指向的堆内存不会被自动释放。C++中只有栈上的局部变量会在作用域结束时自动销毁,堆内存必须通过delete(或delete[])手动释放,否则必然泄漏。测试方法:
- 简单手动测试:给
someClass添加构造和析构函数并打印日志,比如:
运行你的代码后,如果只看到构造日志,没看到析构日志,就说明对象未被销毁,存在内存泄漏。#include <iostream> class someClass { public: someClass() { std::cout << "someClass 构造" << std::endl; } ~someClass() { std::cout << "someClass 析构" << std::endl; } }; - 专业工具测试:Linux下用
valgrind --leak-check=full ./你的程序,它会精准报告泄漏的内存位置和大小;Windows下可以用Visual Studio内置的内存检测工具,开启后运行程序,输出窗口会显示泄漏详情。
- 简单手动测试:给
内容的提问来源于stack exchange,提问作者zbrusko
相关产品推荐
相关产品推荐

