精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

樱花影视一区二区| 激情久久五月天| 亚洲久久久久久久久久| 黑人粗进入欧美aaaaa| 日本在线免费中文字幕| 国产成人在线看| 秋霞av国产精品一区| 中国1级黄色片| 精品亚洲免a| 欧美这里有精品| 国产在线无码精品| 你懂得在线网址| 国产精品一品二品| 国产91色在线播放| 麻豆91精品91久久久| 欧美男同视频网| 日韩视频免费观看高清完整版 | 91精品在线影院| 精品无码一区二区三区电影桃花 | 日韩美女在线| 欧美日韩国内自拍| 亚洲国产一区在线| 色一情一乱一区二区三区| 蜜桃视频免费观看一区| 97久久精品人人澡人人爽缅北| 一二三四国产精品| 奇米影视777在线欧美电影观看| 欧美精品国产精品| 国产黄色片免费在线观看| 日韩在线资源| 久久精品无码一区二区三区| 国产精品久久波多野结衣| 亚洲天堂手机在线| 三级影片在线观看欧美日韩一区二区| 欧美丰满老妇厨房牲生活| 俄罗斯毛片基地| 蜜桃tv一区二区三区| 日韩欧美黄色影院| 国内自拍第二页| 日韩av超清在线观看| 精品久久久久久国产91| 女人色极品影院| www.欧美日本韩国| 一区在线观看视频| 色视频一区二区三区| 男人的天堂在线视频| 99久免费精品视频在线观看 | 欧美激情网址| 欧美成人伊人久久综合网| 国产永久免费网站| 日韩成人一区| 4438x亚洲最大成人网| 人人干人人干人人| 成人国产激情在线| 在线免费不卡视频| 天堂中文视频在线| 日韩中文影院| 欧美在线啊v一区| 老熟妇仑乱视频一区二区| 久久sese| 欧美在线观看禁18| 三上悠亚av一区二区三区| yiren22亚洲综合| 色综合天天综合网天天狠天天 | 精品少妇久久久久久888优播| 91tv官网精品成人亚洲| 久久国产精品影视| 久久中文字幕无码| 亚洲精品美女91| 97在线视频免费| 国产精品21p| 日韩不卡免费视频| 国产一区红桃视频| wwwav在线播放| 成人免费精品视频| 久久久久网址| 一区二区三区视频在线观看视频| 中文字幕在线不卡| 青青在线视频免费观看| 大菠萝精品导航| 日韩欧美一区二区三区久久| 欧美日韩怡红院| 91精品国产一区二区在线观看| 欧美一区二区精品| 艳妇乳肉亭妇荡乳av| 嫩草影视亚洲| 久久九九热免费视频| 久久久久久久久久久久国产| 国产精品久久久久久久久久妞妞| 日韩av观看网址| 一级黄色录像大片| 国产精品亚洲一区二区三区妖精 | 欧美日韩综合| 57pao成人永久免费视频| 中文字幕日韩国产| 粉嫩欧美一区二区三区高清影视| 蜜桃网站成人| 国产一二区在线观看| 亚洲.国产.中文慕字在线| 国产精品人人妻人人爽人人牛| 日韩美香港a一级毛片| 亚洲第一av网站| 日本不卡一区视频| 91久久亚洲| 91网站免费观看| 黄色在线网站| 成人免费视频在线观看| 欧美日韩亚洲一| 成人久久精品| 亚洲欧洲国产伦综合| 欧美色图一区二区| 蜜臀av一区二区在线免费观看| 高清不卡日本v二区在线| 成人精品一区二区三区免费| 一区二区三区在线视频观看58 | 国产亚洲综合久久| 国产精品suv一区二区| 美腿丝袜亚洲三区| 欧美黄色直播| av在线私库| 日韩亚洲欧美在线| 日本女人性生活视频| 欧美一级久久| 国产精品免费视频一区二区| 欧美性天天影视| 色哟哟亚洲精品| 国产十八熟妇av成人一区| 亚洲经典一区| 成人精品久久av网站| 国产三区四区在线观看| 舔着乳尖日韩一区| 亚洲无人区码一码二码三码| 香蕉综合视频| 成人国产精品一区二区| 国产精品四虎| 色婷婷一区二区三区四区| 黄色网址在线视频| 亚洲午夜电影| 成人欧美一区二区| 性欧美video高清bbw| 在线成人av网站| 91ts人妖另类精品系列| 久久成人综合网| 天堂一区二区三区 | 亚洲三级电影在线观看| 147欧美人体大胆444| 免费人成在线观看播放视频| 欧美色欧美亚洲另类二区| 国产精品天天干| 久久综合亚州| 日韩av在线一区二区三区| 午夜日韩成人影院| 国产一区二区三区三区在线观看| 亚洲欧美另类在线视频| 久久毛片高清国产| 88av.com| 日韩精品免费一区二区在线观看 | 无码一区二区三区在线观看| 久久久久久久av麻豆果冻| 女人另类性混交zo| 欧美在线免费看视频| 国产精品丝袜白浆摸在线| 在线免费观看黄色| 欧美一区二区视频在线观看2020| 久久久久亚洲av片无码| 国产酒店精品激情| 97超碰国产精品| 秋霞蜜臀av久久电影网免费| 欧美在线激情网| av每日在线更新| 欧美福利视频导航| 欧美三级小视频| 91蜜桃视频在线| 成人黄色一区二区| 天天射—综合中文网| 成人3d动漫一区二区三区91| 国产在线美女| 中文字幕亚洲专区| 性欧美18一19性猛交| 精品久久久久久中文字幕大豆网| 久久国产精品影院| 精品影视av免费| 中国丰满熟妇xxxx性| 国产精品一国产精品| 国产在线高清精品| caoprom在线| 一区二区欧美日韩视频| 国内精品国产成人国产三级| 偷拍一区二区三区| 你懂得视频在线观看| 国产成人综合精品三级| 国产亚洲综合视频| 欧美gvvideo网站| 国产一区二区不卡视频| 成人不卡视频| 欧美国产一区二区三区| 大胆av不用播放器在线播放| 日韩视频在线观看一区二区| 激情五月婷婷网| 亚洲嫩草精品久久| 97人妻精品一区二区免费| 国产精品一区免费视频| 国产91在线视频观看| 在线成人直播| 欧美日韩精品免费看| 日韩免费精品| 国产精品成人观看视频国产奇米| 91精品久久| 一区国产精品视频| 人妻精品一区二区三区| 91精品国产综合久久福利| 黄瓜视频在线免费观看| 亚洲永久精品国产| 欧美自拍偷拍网| 91丝袜美腿高跟国产极品老师| 国产乱码一区二区三区四区| 美女网站久久| 日韩xxxx视频| 亚洲欧美日韩高清在线| 神马影院午夜我不卡| 国产精品视频3p| 51精品国产人成在线观看| 日韩经典一区| 欧美伊久线香蕉线新在线| 七七久久电影网| 色悠悠久久久久| 可以在线观看的av网站| 日韩的一区二区| 国产91久久久| 日韩欧美在线1卡| 国产精品女同一区二区| 精品视频一区三区九区| 欧美一区二区三区网站| 黑人欧美xxxx| 成人免费看片98| 有坂深雪av一区二区精品| 老熟妇高潮一区二区三区| 国产精品美女一区二区三区| 日韩毛片无码永久免费看| 久久久精品蜜桃| www.久久av| 久久综合999| 黄色正能量网站| 91啪亚洲精品| 公侵犯人妻一区二区三区| 99久久精品99国产精品| 熟妇人妻久久中文字幕| av一区二区三区| 自拍视频一区二区| 91免费观看视频在线| 久久久亚洲av波多野结衣| 久久久久国产精品麻豆ai换脸| aa一级黄色片| 久久精品一区二区三区av| a级大片在线观看| 国产欧美一区二区在线| 手机看片国产日韩| 亚洲欧美日韩成人高清在线一区| 欧美xxxooo| 亚洲欧美日本在线| 久久人人爽人人爽人人| 精品久久久久国产| 午夜精品免费观看| 欧美撒尿777hd撒尿| 国产乱叫456在线| 日韩欧美色综合| 欧美熟妇交换久久久久久分类| 亚洲第一精品夜夜躁人人躁| 天天操天天干天天舔| 亚洲丝袜av一区| 一区二区三区视频在线观看视频| 久久久精品久久久| ririsao久久精品一区| 欧美在线亚洲在线| 激情亚洲小说| 成人区精品一区二区| 婷婷成人综合| 亚洲图色在线| 国产精品大片| 日本精品www| 国内精品免费在线观看| 久久性爱视频网站| 中文一区二区在线观看 | 欧美视频第一页| 自拍偷拍福利视频| 日韩欧美国产综合在线一区二区三区| 亚洲 欧美 激情 小说 另类| 在线视频欧美日韩精品| 岛国成人毛片| 日韩美女视频免费在线观看| 高清在线一区二区| 久久婷婷开心| 国产精品麻豆久久| 日本欧美黄色片| 久久激情综合网| 黄色片视频免费观看| 一色屋精品亚洲香蕉网站| 你懂的国产在线| 91精品国产91久久久久久最新毛片| 手机看片1024国产| 久久精品成人动漫| 性感女国产在线| 91中文字精品一区二区| 不卡在线一区二区| 欧美在线不卡一区| 成年人看的毛片| 爽好久久久欧美精品| 国产精品丝袜在线| 呦呦视频在线观看| 国产精品乱码久久久久久 | 亚洲一区二区视频在线| 69xxxx国产| 亚洲国产精品va在线| 国产激情视频在线观看| 国产精品国产自产拍高清av水多| 97品白浆高清久久久久久| 亚洲精品中文字幕在线| 一区二区三区精品视频在线观看| 久久精品一卡二卡| 国产精品视频第一区| 美女又爽又黄免费视频| 精品剧情v国产在线观看在线| 亚洲图片88| 日韩免费观看在线观看| 精品国产18久久久久久洗澡| 黄色网络在线观看| 蜜桃视频一区二区三区| 中文字幕丰满乱子伦无码专区| 亚洲免费av高清| 中文字幕永久免费视频| 亚洲精品一区二区三区婷婷月| 日韩伦理电影网站| 92福利视频午夜1000合集在线观看| 欧美女优在线视频| 国产午夜福利在线播放| 成人av网址在线观看| 欧美成人精品激情在线视频| 91精品国产综合久久久久久久久久| 成人高清免费在线播放| 国产91免费观看| 伊人成综合网伊人222| 精品人妻一区二区三区四区在线| 成人精品小蝌蚪| 国产中文字幕免费| 亚洲精品在线观看网站| heyzo一区| 精品福利影视| 销魂美女一区二区三区视频在线| 熟妇人妻久久中文字幕| 精品福利视频导航| 日本一区二区三区在线观看视频| 欧美一级在线亚洲天堂| 蜜桃一区二区三区| 国产裸体免费无遮挡| 国产精品色呦呦| 亚洲天堂自拍偷拍| 久久精品99久久久久久久久| 欧美h版在线观看| 精品国产一区二区三区无码| 成人在线视频一区二区| 91国产丝袜播放在线| 亚洲欧美国产一本综合首页| 日韩成人亚洲| 精品国产三级a∨在线| 国产激情视频一区二区三区欧美 | 色综合久久久久久久| 男人天堂网在线观看| 国产日韩av在线播放| 中文不卡在线| 午夜剧场免费看| 一本大道综合伊人精品热热| 91在线视频免费看| 91精品黄色| 亚洲永久字幕| 国产精品综合激情| 精品久久久久久无| 欧美电影网站| 精品国产三级a∨在线| 91在线视频18| 91亚洲国产成人久久精品麻豆 | 欧美日韩免费看片| 一区二区三区视频在线播放| 国产精品一区二区在线播放| 国产欧美日韩另类| 神马国产精品影院av| 成人在线视频你懂的| 污污视频网站免费观看| 亚洲品质自拍视频| 欧洲毛片在线| 亚洲影院高清在线| 老司机精品视频网站| 成人免费视频网站入口::| 精品一区二区三区四区| 四虎在线精品| 黄色a级片免费| 亚洲人123区| 黄色av免费在线观看| 成人性色av| 美女视频一区二区三区| 国产福利拍拍拍|