MST

星途 面试题库

面试题:C++中常见的内存泄漏场景及检测方法

请列举至少三种C++编程中可能导致内存泄漏的常见场景,并说明如何使用工具(如Valgrind)或代码手段检测这些内存泄漏。
47.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

常见导致内存泄漏场景

  1. 动态内存分配后未释放
    • 示例代码:
    void memoryLeak1() {
        int* ptr = new int;
        // 没有delete ptr;
    }
    
  2. 数组动态分配后使用普通delete释放
    • 示例代码:
    void memoryLeak2() {
        int* arr = new int[10];
        delete arr; // 应该使用delete[] arr;
    }
    
  3. 对象生命周期管理不当(如在容器中存储指针,容器销毁时指针未释放)
    • 示例代码:
    #include <vector>
    class MyClass {};
    void memoryLeak3() {
        std::vector<MyClass*> vec;
        vec.push_back(new MyClass);
        // 当vec销毁时,MyClass对象的指针没有释放
    }
    

使用Valgrind检测内存泄漏

  1. 安装Valgrind:根据不同的操作系统,使用相应的包管理器安装Valgrind。例如在Ubuntu上,可以使用sudo apt - get install valgrind
  2. 编译程序:使用-g选项编译C++程序,以包含调试信息,例如g++ -g -o myprogram myprogram.cpp
  3. 运行Valgrind:使用valgrind --leak - check = full./myprogram运行程序。Valgrind会输出详细的内存泄漏信息,包括泄漏发生的位置、泄漏的块大小等。

使用代码手段检测内存泄漏

  1. 智能指针
    • 使用std::unique_ptrstd::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]);
        // 离开作用域时数组内存自动释放
    }
    
  2. 自定义资源管理类
    • 实现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
    }