成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++ 內存泄漏的五大致命陷阱!90% 程序員踩過的坑你中招了嗎?

開發
C++中內存泄漏指程序未能正確釋放已動態分配的內存,導致內存資源浪費。常見的內存泄漏類型如下。

C++中內存泄漏指程序未能正確釋放已動態分配的內存,導致內存資源浪費。常見的內存泄漏類型如下:

1. 未釋放動態內存

第一種情況:使用new分配內存后未調用delete釋放。

示例:

void func() {  
    int* ptr = new int(10);  
    // 忘記delete ptr  
}

每次調用func()都會泄漏內存(常發性泄漏)。若函數被多次調用,內存耗盡風險高。

第二種情況 :異常導致內存未釋放,在 new 和 delete 之間拋出異常,導致 delete 未執行。

示例:

void risky() {
    int* ptr = new int(42);
    some_function_that_may_throw(); // 可能拋出異常
    delete ptr; // 如果異常拋出,此行不會執行
}

修復:使用 RAII 或智能指針(如 std::unique_ptr)自動管理內存:

std::unique_ptr<int> ptr(new int(42));
//或者
auto ptr = std::make_unique<int>(42);

第三種情況:容器中的指針未釋放,容器存儲指針,但未在銷毀容器前釋放內存。

示例:

std::vector<int*> vec;
vec.push_back(new int(10));
vec.push_back(new int(20));

// 直接清空容器,但內存未釋放
vec.clear();

修復:手動釋放內存或者使用智能指針

for (auto ptr : vec) {
    delete ptr;
}
vec.clear();
std::vector<std::unique_ptr<int>> vec;
vec.push_back(std::make_unique<int>(10)); // C++14
// 無需手動釋放,容器clear時自動釋放內存

2. 錯誤使用delete

第一種:數組未用delete[]

int* arr = new int[5]  
delete arr; // 錯誤,應使用delete[] arr

導致數組元素未被完全釋放,可能引發未定義行為。

第二種:對void*指針使用delete

class Object { /* ... */ };  
void* ptr = new Object();  
delete ptr; // 錯誤,未調用Object析構函數

正確做法:轉換為原類型再delete。

3. 資源泄漏(文件 網絡 線程)

未釋放文件句柄、數據庫連接等系統資源。

示例:

void openFile() {  
    FILE* file = fopen("data.txt", "r");  
    // 忘記fclose(file);  
}

資源泄漏可能間接導致內存問題。

修改:調用fclose或者使用下面的C++風格

void openFile() {
    std::fstream file("data.txt");
    // 無需手動關閉,析構時自動釋放
}

4. 未定義虛析構函數

基類指針指向派生類對象時,若基類析構函數非虛,派生類析構函數不會被調用。

示例:

class Base { public: ~Base() {} };  
class Derived : public Base { private: int* data; };  

Base* obj = new Derived();  
delete obj; // 僅調用Base析構函數,Derived的data未釋放

解決方案:將基類析構函數聲明為virtual。

5. 循環引用(智能指針場景)

原因:shared_ptr相互引用導致引用計數無法歸零。

示例:

class A {  
public:  
    shared_ptr b_ptr;  
};  
class B {  
public:  
    shared_ptr a_ptr;  
};  

auto a = make_shared();  
auto b = make_shared();  
a->b_ptr = b;  
b->a_ptr = a; // 循環引用,內存無法釋放

解決方案:使用weak_ptr打破循環。

將其中一個指針改為 std::weak_ptr:

class B {
public:
    std::weak_ptr<A> a_weak_ptr; // 使用 weak_ptr 打破循環
};

如何避免內存泄漏?

  • 優先使用智能指針:如 std::unique_ptr、std::shared_ptr 和 std::weak_ptr。
  • 遵循 RAII 原則:將資源管理封裝在對象生命周期中(如文件句柄、鎖等)。
  • 使用工具檢測泄漏:如 Valgrind、AddressSanitizer 等。
責任編輯:趙寧寧 來源: CppPlayer
相關推薦

2025-05-27 08:45:00

2021-08-16 14:00:27

手機科技功能

2015-09-22 09:26:21

DBA失誤備份數據丟失

2025-04-27 00:04:00

C#異步編程

2025-02-10 00:00:25

內存管理開發

2015-09-25 15:34:24

DBA共享密碼數據竊取

2018-05-28 14:55:56

職業錯誤程序員

2021-01-07 08:12:08

自學編程學習

2020-10-10 17:34:11

大數據IT技術

2025-05-29 09:21:38

2015-09-25 11:47:27

頁校驗數據損壞DBA

2015-11-04 11:38:40

bug程序員

2018-03-29 05:56:43

Wi-Fi無線網絡數據安全

2015-09-16 11:53:21

2015-09-25 14:18:26

最小權限原則DBA數據安全

2025-04-29 08:30:00

迭代器失效C++編程

2014-07-14 10:05:10

2024-04-26 00:15:51

2025-04-03 12:30:00

C 語言隱式類型轉換代碼

2010-03-25 09:58:25

大齡程序員
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品一区二区三区在线 | 国产成人精品一区二 | 欧美日韩一区二区在线播放 | 亚洲精品一区二区 | 免费激情网站 | 免费看爱爱视频 | av天天看 | 99精品一区二区 | 毛片免费视频 | 日本又色又爽又黄又高潮 | 99国产精品久久久久老师 | 欧美理论片在线 | 亚洲欧美视频在线观看 | 三级成人在线观看 | 一本色道久久综合亚洲精品高清 | 黄色av网站在线观看 | 久久69精品久久久久久久电影好 | 二区成人 | 亚洲视频免费观看 | 国产大片黄色 | 国产丝袜av| 亚洲欧美一区二区三区1000 | 国产视频中文字幕 | 亚洲国产高清在线 | 免费成人av网站 | 超碰97人人人人人蜜桃 | 一级日批片 | 久久亚洲春色中文字幕久久久 | 欧美日韩免费一区二区三区 | 香蕉一区 | 亚洲天堂精品一区 | 欧美人成在线视频 | 国产第一页在线观看 | 天天综合久久 | 男人影音| 日韩成人免费视频 | 精品一区国产 | 伊人精品在线视频 | 精品videossex高潮汇编 | 欧美中文字幕一区二区三区亚洲 | 欧美日韩在线观看视频 |