[英]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.