面试题答案
一键面试常见导致内存泄漏场景
- 动态内存分配后未释放:
- 示例代码:
void memoryLeak1() { int* ptr = new int; // 没有delete ptr; }
- 数组动态分配后使用普通delete释放:
- 示例代码:
void memoryLeak2() { int* arr = new int[10]; delete arr; // 应该使用delete[] arr; }
- 对象生命周期管理不当(如在容器中存储指针,容器销毁时指针未释放):
- 示例代码:
#include <vector> class MyClass {}; void memoryLeak3() { std::vector<MyClass*> vec; vec.push_back(new MyClass); // 当vec销毁时,MyClass对象的指针没有释放 }
使用Valgrind检测内存泄漏
- 安装Valgrind:根据不同的操作系统,使用相应的包管理器安装Valgrind。例如在Ubuntu上,可以使用
sudo apt - get install valgrind
。 - 编译程序:使用-g选项编译C++程序,以包含调试信息,例如
g++ -g -o myprogram myprogram.cpp
。 - 运行Valgrind:使用
valgrind --leak - check = full./myprogram
运行程序。Valgrind会输出详细的内存泄漏信息,包括泄漏发生的位置、泄漏的块大小等。
使用代码手段检测内存泄漏
- 智能指针:
- 使用
std::unique_ptr
,std::shared_ptr
等智能指针来管理动态分配的内存。例如:
void noLeak1() { std::unique_ptr<int> ptr(new int); // 当ptr离开作用域时,内存会自动释放 }
- 对于数组,可以使用
std::unique_ptr<int[]>
:
void noLeak2() { std::unique_ptr<int[]> arr(new int[10]); // 离开作用域时数组内存自动释放 }
- 使用
- 自定义资源管理类:
- 实现RAII(Resource Acquisition Is Initialization)类来管理资源。例如:
class MyResource { private: int* data; public: MyResource() : data(new int) {} ~MyResource() { delete data; } }; void noLeak3() { MyResource res; // res离开作用域时,MyResource的析构函数会释放data }