簡體   English   中英

C ++ strcpy內存泄漏

[英]C++ strcpy memory leak

我有一個C ++ 98測試代碼。 這段代碼制造了一個可怕的記憶湖。 為什么? 釋放指針之后的內存消耗與釋放之前相同。

#include <iostream>
#include "string.h"


using namespace std;

void test();

int main() {
    test();
    cout << "Freed" << endl;
    int input;
    cin >> input;
    cout << "Good bye" << endl;
    return 0;
}

void test() {
    int input;
    int count = 40000000;
    const char *str = "9 770123456789123456123";
    char **pMsg = new char *[count];
    cout << "Register: " << count << endl;
    cin >> input;
    for (int i = 0; i < count; i++) {
        pMsg[i] = new char[strlen(str) + 1];
        strcpy(pMsg[i], str);
    }
    cout << "Full pointers" << endl;
    cin >> input;

    for (int i = 0; i < count; i++) {
        delete[] pMsg[i];
    }
    delete[] pMsg;
}

原則上,您的內存不會泄漏,因為每個new[]前都有一個delete[] new[]

但是,當您分配大量內存時(甚至通常在任何時候分配內存時),都應考慮分配失敗的情況:

    ...
    try {
        test();
    }
    catch(bad_alloc) {
        cerr << "No more memory !" <<endl; 
    }
    ...

引發異常(在此處發生)的事實將導致您的代碼在刪除發生之前離開test() 因此,由於異常,您的內存將泄漏。

備注: 避免此類內存泄漏的最佳方法是使用RAII慣用語:僅在對象內部進行內存分配,然后釋放對象的析構函數中的內存。 由於所有超出范圍的對象都將被刪除,因此即使在發生異常的情況下,也可以確保始終進行內存爭奪。

“釋放指針之后的內存消耗與釋放之前相同”。 這不是指示性的,許多free實現通常不會將內存返回給OS,而是“回收”它以供將來分配。 看到這個問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM