精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++不用工具如何檢測內存泄漏?這七種方法你必須知道!

開發
今天就來分享幾種不依賴專門工具的內存泄漏檢測方法,從簡單到高級,帶你徹底搞懂這個問題!

大家好,我是小康!

最近刷到知乎一個挺有意思的問題:

看到這個問題,我想起了自己剛開始寫C++時被內存泄漏折磨的日子。說實話,這確實是個很有挑戰性的面試題!

今天就來分享幾種不依賴專門工具的內存泄漏檢測方法,從簡單到高級,帶你徹底搞懂這個問題!

核心思路:記錄與對比

在開始具體方法之前,先說說核心思想:既然內存泄漏就是"申請了但沒釋放",那我們只要記錄每次申請和釋放,最后對比一下不就知道了?

聽起來簡單,但實現起來有很多細節和技巧。

方法一:最簡單粗暴的手動記錄法

核心思想:既然malloc有多少,就用free釋放多少,那我們手動記個賬不就行了?

// 簡單的全局計數器
staticint g_malloc_count = 0;

void* my_malloc(size_t size) {
    void* ptr = malloc(size);
    if (ptr) {
        g_malloc_count++;
        printf("Malloc: %p, count: %d\n", ptr, g_malloc_count);
    }
    return ptr;
}

void my_free(void* ptr) {
    if (ptr) {
        g_malloc_count--;
        printf("Free: %p, count: %d\n", ptr, g_malloc_count);
        free(ptr);
    }
}

// 程序結束時檢查
void check_leaks() {
    if (g_malloc_count != 0) {
        printf("內存泄漏!還有 %d 個未釋放的內存塊\n", g_malloc_count);
    }
}

優點:思路清晰,易于理解缺點:只能知道有泄漏,但不知道在哪里泄漏

這種方法適合快速驗證是否有內存泄漏,但定位能力有限。

方法二:進階版 - 重載operator new/delete

這是最實用的方法!通過重載全局的operator new和operator delete,可以精確追蹤每一次內存分配和釋放。

#include <iostream>
#include <unordered_map>
#include <mutex>

struct MemInfo {
    size_t size;
    constchar* file;
    int line;
};

staticstd::unordered_map<void*, MemInfo> g_alloc_map;
staticstd::mutex g_mutex;

// 重載全局operator new
void* operator new(size_t size, const char* file, int line) {
    void* ptr = malloc(size);
    if (ptr) {
        std::lock_guard<std::mutex> lock(g_mutex);
        g_alloc_map[ptr] = {size, file, line};
    }
    return ptr;
}

// 重載全局operator delete
void operator delete(void* ptr) noexcept {
    if (ptr) {
        {
            std::lock_guard<std::mutex> lock(g_mutex);
            g_alloc_map.erase(ptr);
        }
        free(ptr);
    }
}

// 宏定義,自動傳入文件名和行號
#define new new(__FILE__, __LINE__)

// 檢查泄漏
void check_memory_leaks() {
    std::lock_guard<std::mutex> lock(g_mutex);
    if (!g_alloc_map.empty()) {
        std::cout << "發現內存泄漏:\n";
        for (constauto& pair : g_alloc_map) {
            constauto& info = pair.second;
            std::cout << "地址: " << pair.first 
                      << ", 大小: " << info.size 
                      << ", 位置: " << info.file << ":" << info.line << "\n";
        }
    } else {
        std::cout << "恭喜!沒有內存泄漏\n";
    }
}

測試代碼:

int main() {
    int* p1 = new int(42);        // 會被正確釋放
    int* p2 = new int[100];       // 故意不釋放,制造泄漏
    
    delete p1;
    // delete[] p2;  // 故意注釋掉
    
    check_memory_leaks();  // 會準確報告p2的泄漏位置
    return 0;
}

這種方法的核心是利用哈希表管理內存:new的時候將內存信息存入,delete的時候移除,程序結束后查看剩余節點判斷泄漏。

優勢:能精確定位到文件名和行號!

方法三:Windows平臺 - 利用CRT調試功能

如果你在Windows下開發,微軟已經給你準備好了現成的方案:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

int main() {
    // 啟用內存泄漏檢測
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    
    // 你的代碼
    int* p = newint[100];
    // delete[] p;  // 故意注釋掉制造泄漏
    
    // 程序結束時會自動報告泄漏
    return0;
}

包含crtdbg.h會將malloc和free函數映射到其調試版本,它們會自動跟蹤內存分配和釋放。

優點:微軟官方支持,穩定可靠缺點:只能在Windows + MSVC環境使用

方法四:高級玩法 - RAII + 智能指針統計

利用C++的RAII機制,我們可以更優雅地檢測內存泄漏:

#include <atomic>
#include <iostream>

class MemoryTracker {
private:
    staticstd::atomic<int> alive_count_;
    
public:
    MemoryTracker() { alive_count_++; }
    ~MemoryTracker() { alive_count_--; }
    
    static int get_alive_count() { return alive_count_; }
};

std::atomic<int> MemoryTracker::alive_count_{0};

// 帶追蹤功能的智能指針包裝
template<typename T>
class tracked_ptr {
    std::unique_ptr<T> ptr_;
    MemoryTracker tracker_;
    
public:
    explicit tracked_ptr(T* p) : ptr_(p) {}
    T* get() { return ptr_.get(); }
    T& operator*() { return *ptr_; }
    T* operator->() { return ptr_.get(); }
};

// 工廠函數
template<typename T, typename... Args>
tracked_ptr<T> make_tracked(Args&&... args) {
    return tracked_ptr<T>(new T(std::forward<Args>(args)...));
}

int main() {
    {
        auto p1 = make_tracked<int>(42);
        auto p2 = make_tracked<int>(100);
        std::cout << "當前存活對象: " << MemoryTracker::get_alive_count() << std::endl;
    } // p1, p2 在這里自動銷毀
    
    std::cout << "程序結束時存活對象: " << MemoryTracker::get_alive_count() << std::endl;
    return0;
}

這種方法結合了現代C++的特性,既安全又優雅。

方法五:Linux下的mtrace方法

Linux系統提供了mtrace函數來追蹤內存分配:

#include <mcheck.h>

int main() {
    mtrace();  // 開始追蹤
    
    // 你的代碼
    int* p = (int*)malloc(sizeof(int) * 100);
    // free(p);  // 故意不釋放
    
    muntrace(); // 結束追蹤,輸出報告
    return 0;
}

使用方法:

export MALLOC_TRACE=./mem_trace.log
./your_program
mtrace your_program mem_trace.log

方法六:Linux黑科技 - LD_PRELOAD動態攔截

這是我最喜歡的方法,因為它可以在不修改任何源碼的情況下檢測任何程序的內存泄漏!

創建 leak_detector.c:

#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>

staticvoid* (*real_malloc)(size_t) = NULL;
static void (*real_free)(void*) = NULL;
staticint alloc_count = 0;

void* malloc(size_t size) {
    if (!real_malloc) {
        real_malloc = dlsym(RTLD_NEXT, "malloc");
    }
    void* ptr = real_malloc(size);
    alloc_count++;
    printf("MALLOC: %p, size: %zu, count: %d\n", ptr, size, alloc_count);
    return ptr;
}

void free(void* ptr) {
    if (!real_free) {
        real_free = dlsym(RTLD_NEXT, "free");
    }
    if (ptr) {
        alloc_count--;
        printf("FREE: %p, count: %d\n", ptr, alloc_count);
    }
    real_free(ptr);
}

__attribute__((destructor))
void check_leaks() {
    if (alloc_count != 0) {
        printf("內存泄漏!未釋放: %d 個內存塊\n", alloc_count);
    }
}

編譯和使用:

# 編譯成動態庫
gcc -shared -fPIC leak_detector.c -o leak_detector.so -ldl

# 對任何程序進行內存檢測(無需修改源碼!)
LD_PRELOAD=./leak_detector.so ./your_program

這個方法的強大之處: 

  • 零侵入:不需要修改任何現有代碼
  • 全覆蓋:連第三方庫的內存分配都能檢測
  • 即插即用:任何程序都可以直接使用

這絕對是面試中的加分點,展現了對Linux系統編程的深度理解!

方法七:面試加分項 - 靜態變量內存檢測

這是一個很少有人能答出來的高級技巧。靜態變量的內存分配發生在main函數之前,檢測起來更有挑戰性:

class StaticMemoryDetector {
    struct MemRecord {void* ptr; size_t size; };
    staticinlinestd::vector<MemRecord> early_allocs;
    staticinlinebool main_started = false;
    
public:
    // 重載全局operator new,在靜態初始化期間自動捕獲
    static void* operator new(size_t size) {
        void* ptr = malloc(size);
        if (!main_started) {
            early_allocs.push_back({ptr, size});
        }
        return ptr;
    }
    
    static void mark_main_start() { main_started = true; }
    
    static void check_static_leaks() {
        std::cout << "檢測到靜態期分配: " << early_allocs.size() << " 個\n";
    }
};

int main() {
    StaticMemoryDetector::mark_main_start();
    StaticMemoryDetector::check_static_leaks();
    return0;
}

注意:上面提供的是示例代碼,主要是給大家一些思路,實際實現會更復雜。

面試回答技巧

當面試官問這個問題時,你可以這樣回答:

"不用專門工具檢測內存泄漏,主要有幾種思路:

(1) 最簡單的是手動計數 - 記錄malloc/new的次數和free/delete的次數

(2) 更實用的是重載operator new/delete - 用哈希表記錄每次分配的地址、大小、文件名和行號

(3) Windows下可以用CRT調試功能 - 只需要包含crtdbg.h并設置相應標志

(4) 高級一點的可以結合RAII思想 - 用對象的構造析構來追蹤生命周期

(5) Linux下有mtrace和LD_PRELOAD兩種方式:

  • mtrace需要在代碼中添加調用
  • LD_PRELOAD更強大,可以零侵入檢測任何程序

(6) 最難的是檢測靜態變量泄漏 - 需要區分程序啟動前后的內存分配

核心思想都是在內存分配和釋放時做記錄,程序結束時對比記錄找出未釋放的內存。"

這樣回答既展現了技術深度,又體現了實踐經驗。

總結

不用工具檢測內存泄漏的核心是"記錄和對比" - 在分配時記錄,在釋放時清除記錄,程序結束時檢查剩余記錄。

從實用性來看:

  • 重載operator new/delete + 宏定義是最實用的方法
  • LD_PRELOAD是最強大的黑科技
  • CRT調試功能是Windows下最簡單的方案

希望這些方法能幫到正在被內存泄漏困擾的你!

責任編輯:趙寧寧 來源: 跟著小康學編程
相關推薦

2011-12-16 14:45:36

JavaJSP

2012-09-29 10:29:56

.Net內存分配繼承

2012-09-29 09:22:24

.NETGC內存分配

2011-05-30 13:37:46

JSP

2021-11-19 10:10:14

手機移動設備網絡攻擊

2020-09-09 10:53:06

前端開發工具

2016-09-28 20:05:22

2019-05-30 08:00:00

2011-06-16 09:28:02

C++內存泄漏

2022-05-18 09:01:31

JavaScriptEvalErrorURIError

2022-10-27 08:09:33

2024-07-29 08:00:00

2023-04-18 15:57:30

2022-09-30 10:48:12

AR制造業

2022-01-21 10:42:55

IT領導者IT事業職業顧問

2010-06-25 09:18:43

MySQLOracle

2025-01-02 10:24:54

Spring控制器單元測試

2021-07-02 10:43:52

IT人才首席信息官人才招聘

2016-12-27 19:19:51

2009-10-29 16:32:24

查看Oracle用戶的
點贊
收藏

51CTO技術棧公眾號

午夜精品国产更新| 狠狠色狠狠色综合系列| 亚洲丁香婷深爱综合| 国产精品久久中文字幕| 日韩精品123| 免费的国产精品| 欧美成人激情在线| 国产极品一区二区| 国产精品久久亚洲不卡| 一区二区在线免费| 精品一卡二卡三卡四卡日本乱码| 好吊色在线视频| 久久精品欧美一区| 亚洲国产精品va在线看黑人| 国产一级不卡毛片| a视频在线观看| 2021国产精品久久精品| 成人精品久久一区二区三区| 国产性70yerg老太| 日韩精品dvd| 亚洲成色777777女色窝| 污网站在线免费| 手机在线观看av网站| 1024亚洲合集| 欧美精品国产精品久久久 | 岛国精品视频在线播放| 一区二区三区在线视频看| 欧美一级特黄aaaaaa| 麻豆国产精品视频| 欧美中文在线观看国产| 99精品久久久久| 97精品国产| 中文字幕国产精品久久| 亚洲制服丝袜在线播放| 久久久久久亚洲精品美女 | 国产免费福利视频| 欧美一级视频| 国内精久久久久久久久久人| 日韩在线观看视频一区二区| 欧美亚洲激情| 国产亚洲美女久久| 三级电影在线看| 51精品国产| 日韩精品一区二区三区中文精品| 国产永久免费网站| 99久久亚洲国产日韩美女| 欧美性xxxxxxx| 欧美精品99久久| а√天堂8资源在线| 亚洲电影激情视频网站| 国产欧美久久久久| 在线播放免费av| 亚洲欧美国产77777| 中文字幕欧美日韩一区二区| 成人免费一区二区三区视频网站| 国产亚洲欧美日韩在线一区| 欧美一二三区| av资源种子在线观看| 国产欧美精品国产国产专区| 日韩精品久久久免费观看| 激情小说 在线视频| 久久精品一区二区三区不卡牛牛| 国产日韩三区| 午夜国产在线视频| 2021国产精品久久精品| 日本免费一区二区三区| 九色视频在线播放| 日本一区二区免费在线观看视频| 午夜精品亚洲一区二区三区嫩草| 成年人视频免费在线观看| 国产精品热久久久久夜色精品三区| 色涩成人影视在线播放| 91看片在线观看| 亚洲欧洲av另类| 色一情一乱一乱一区91| 欧洲在线视频| 欧美日韩国产精品一区| 那种视频在线观看| 欧美暴力调教| 欧美一三区三区四区免费在线看 | 久久成人在线视频| 青青草国产在线观看| 国内揄拍国内精品久久| 9.1国产丝袜在线观看| 无码人妻精品一区二区50| 免费观看在线色综合| 亚洲一区二区三区在线免费观看| 亚洲风情第一页| 久久男人中文字幕资源站| 亚洲人成77777| 日韩少妇视频| 色猫猫国产区一区二在线视频| 黄色一级片免费的| 国产精品欧美大片| 在线日韩欧美视频| 久久国产露脸精品国产| 久久久噜噜噜久久狠狠50岁| 91中文在线观看| 蝌蚪视频在线播放| 亚洲欧美一区二区三区久本道91| 国产 福利 在线| 国产一区二区三区视频在线| 日韩精品亚洲精品| 亚洲xxxx3d动漫| 久久aⅴ国产紧身牛仔裤| 成人性生交大片免费看视频直播 | 久久亚洲成人精品| 毛片视频网站在线观看| 精品一区二区三区影院在线午夜| 国产精品视频免费一区二区三区| av资源在线观看免费高清| 亚洲国产美女搞黄色| 五月婷婷六月合| 欧美日韩一区二区三区不卡视频| 日韩在线观看免费高清完整版| 日韩经典在线观看| 国内精品国产三级国产a久久| 久久精品欧美| 暖暖在线中文免费日本| 欧美影视一区二区三区| 老司机免费视频| 91精品国产乱码久久久久久| 日韩av免费在线| 深爱五月激情五月| 亚洲精品欧美激情| 538任你躁在线精品免费| 欧美黄色影院| 欧美激情2020午夜免费观看| ,亚洲人成毛片在线播放| 久久精品一二三| 国产在线精品91| 91精品久久久久久综合五月天| 色妞一区二区三区| 国产精品免费无遮挡无码永久视频| 成人黄色大片在线观看| 性生活免费观看视频| 日本午夜精品久久久久| 国产亚洲xxx| 黑人精品无码一区二区三区AV| 69国产精品视频免费观看| 久久99伊人| 久久99导航| 高h视频在线播放| 日韩精品一区二区三区老鸭窝| 国产麻豆a毛片| 蜜臀av性久久久久av蜜臀妖精| 日韩精彩视频| 亚洲成人一区在线观看| 亚洲情综合五月天| 免费观看成人毛片| 久久综合久色欧美综合狠狠| 91视频最新入口| 在线成人动漫av| 欧洲永久精品大片ww免费漫画| 午夜福利理论片在线观看| 精品久久久久久中文字幕| 国产激情视频网站| 一本色道久久综合| 精品无人区一区二区三区竹菊| 麻豆成全视频免费观看在线看| 日韩av中文字幕在线| 免费黄色网址在线| 久久久久免费观看| www.99在线| 久久综合成人| 亚洲一区二区免费在线| 色图在线观看| 日韩精品在线视频观看| 亚洲熟妇av一区二区三区| 亚洲AV无码一区二区三区性 | 日本人亚洲人jjzzjjz| 久久高清国产| 三区精品视频| 国产精品va视频| 欧美精品久久久久久久久久| 无码精品人妻一区二区三区影院 | 欧美成在线视频| 免费观看黄一级视频| 黑人精品xxx一区一二区| 玖玖爱在线观看| 美女尤物国产一区| 九一免费在线观看| 青草久久视频| 国产精品啪视频| 中文字幕伦理免费在线视频| 亚洲第一天堂av| 波多野结衣电车痴汉| 国产精品久久久久久久裸模| 99国产精品免费视频| 在线亚洲伦理| 在线观看亚洲视频啊啊啊啊| heyzo欧美激情| 国产福利视频一区| www.在线视频| 亚洲老头同性xxxxx| 在线黄色av网站| 亚洲国产欧美一区二区三区丁香婷| 亚洲精品视频久久久| 紧缚奴在线一区二区三区| 日韩av高清在线看片| 欧美日一区二区| 国产99在线播放| 成人精品国产亚洲| 久久久在线观看| av片在线看| 亚洲成人1234| 91精品人妻一区二区三区果冻| 偷窥少妇高潮呻吟av久久免费| 精品一区二区6| 99在线精品观看| www.五月天色| 久久精品毛片| 青青在线免费观看| 国产精品久久观看| 奇米888一区二区三区| 91综合久久爱com| 国产精品一区二区三区在线播放| а√天堂中文在线资源8| 理论片在线不卡免费观看| 黄色av网站在线看| 亚洲激情成人网| av av片在线看| 欧美日韩中文另类| 99久久精品国产亚洲| 亚洲午夜视频在线| 97成人资源站| 国产精品国产三级国产专播品爱网 | 欧美xxxx老人做受| 一卡二卡在线观看| 一本大道久久a久久精二百| 日本免费观看视| 亚洲一区中文在线| 国产一区二区三区在线视频观看| 国产欧美精品一区二区三区四区| 国产吞精囗交久久久| 国产91精品欧美| 男人操女人下面视频| 久久99精品视频| 日本肉体xxxx裸体xxx免费| 久久黄色影院| 玩弄japan白嫩少妇hd| 在线一区视频| 青青草原成人网| 99精品国产一区二区青青牛奶| 97在线国产视频| 亚洲午夜电影| 成人午夜视频在线观看免费| 韩国久久久久| 久草视频国产在线| 精品成人国产| 男人日女人逼逼| 国产亚洲精品久久久久婷婷瑜伽| 国产毛片视频网站| 99精品久久| 欧美v在线观看| 麻豆精品91| 国产情侣av自拍| 麻豆精品视频在线| 成人亚洲免费视频| 国产老女人精品毛片久久| 免费不卡av网站| 成人精品视频.| av网站免费在线播放| 久久精品视频在线免费观看| 亚洲成人黄色av| 国产精品无人区| 免费在线黄色网| 午夜成人免费视频| 丰满少妇xoxoxo视频| 欧美日韩一区二区三区四区五区| ,一级淫片a看免费| 精品免费视频.| 三级毛片在线免费看| 在线观看精品国产视频| 欧美69xxxx| 欧美激情综合色综合啪啪五月| 日本三级一区| 国产精品久久久久久亚洲影视| 亚洲欧洲一二区| 国产精品自拍首页| 国产午夜一区| 蜜臀av性久久久久蜜臀av| 1024精品一区二区三区| 欧美亚洲日本在线观看| 国产在线精品一区二区夜色| 黑人玩弄人妻一区二区三区| 久久免费看少妇高潮| 很污很黄的网站| 五月开心婷婷久久| 中日精品一色哟哟| 亚洲成色777777在线观看影院| 成人性爱视频在线观看| 欧美精品18videosex性欧美| av日韩亚洲| 亚洲最大av网| 神马影视一区二区| 日本成人在线不卡| 日韩精品91亚洲二区在线观看| 青娱乐国产精品视频| 91老师国产黑色丝袜在线| 小向美奈子av| 色综合久久久久综合体桃花网| 国产毛片毛片毛片毛片毛片| 亚洲激情国产精品| 国产一二三区在线观看| 51ⅴ精品国产91久久久久久| 精品国产亚洲日本| 日韩av图片| 日韩亚洲在线| 欧美性猛交乱大交| 中文在线免费一区三区高中清不卡| 日韩女同强女同hd| 在线不卡免费av| 国际av在线| 26uuu亚洲国产精品| 欧州一区二区三区| 亚洲成人a**址| 欧美一级久久| 麻豆精品国产传媒av| 亚洲精品视频一区二区| 亚洲一卡二卡在线观看| 亚洲精品视频久久| 超碰在线公开| 国产精品99久久久久久久| 亚洲激情中文在线| 999精品视频在线| 久久久av毛片精品| 好吊妞视频一区二区三区| 精品三级在线看| a级毛片免费观看在线| 国产日韩欧美自拍| 成人羞羞在线观看网站| 欧美日韩一区二区在线免费观看| 99在线热播精品免费| 精品少妇爆乳无码av无码专区| 欧美一区二区三区的| 黄色网在线看| 成人在线视频网| 99精品在线观看| 国产精品自在自线| 1024亚洲合集| 国产又大又黄又爽| 日韩在线观看免费av| 未满十八勿进黄网站一区不卡| 亚洲成人第一| 久久99久久99| 国产十六处破外女视频| 制服丝袜日韩国产| 最新超碰在线| 懂色一区二区三区av片| 国精品一区二区| 中文字幕在线永久| 五月婷婷激情综合| 亚洲欧美自偷自拍| 欧美洲成人男女午夜视频| 欧洲vs亚洲vs国产| 丰满少妇被猛烈进入高清播放| 91蝌蚪porny九色| 最近免费中文字幕大全免费版视频| 精品一区二区电影| 亚洲天堂一区二区| 亚洲 国产 日韩 综合一区| 蜜臀va亚洲va欧美va天堂| 欧美日韩色视频| 欧美xxxx老人做受| 色多多在线观看| 亚洲精品乱码视频| 狠狠色狠狠色综合| 久久精品视频国产| 亚洲跨种族黑人xxx| 久久久久毛片| 国产美女作爱全过程免费视频| 99麻豆久久久国产精品免费 | 666欧美在线视频| av网站大全在线| 韩国一区二区三区美女美女秀| 国产日韩欧美一区二区三区在线观看| 黄瓜视频污在线观看| 欧美日韩小视频| 欧洲中文在线| 日韩精品欧美专区| 国产乱理伦片在线观看夜一区| 青青操免费在线视频| 中文字幕精品国产| 亚洲精品一区二区三区在线| 能在线观看的av| 亚洲免费在线视频一区 二区| 蜜桃视频污在线观看| 国产精品福利网站| 欧美先锋影音| 日韩女同一区二区三区| 日韩精品一区二区在线| 91看片一区| 欧美黄网在线观看| 久久精品一区二区三区不卡牛牛| 99精品在线视频观看| 国产成人精品日本亚洲| 国产精品第十页| 大吊一区二区三区| 日韩激情av在线播放|