我有一个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;
}
答案 0 :(得分:3)
原则上你的记忆不会泄漏,因为你delete[]
每new[]
个 ...
try {
test();
}
catch(bad_alloc) {
cerr << "No more memory !" <<endl;
}
...
。
但是当你分配大量内存时(甚至一般来说,每当你分配内存时),你应该考虑分配失败的情况:
test()
引发异常(此处发生)的事实将导致代码在删除发生之前离开div.SelectSingleNode(".//div[@class='entry-content']/p[1]/a/img").Attributes["src"].Value;
。所以由于例外,你的记忆力会泄漏。
备注: 避免此类内存泄漏的最佳方法是使用RAII惯用法:只在对象内部进行内存分配,并释放对象析构函数中的内存。由于所有超出范围的对象都将被删除,这将确保始终发生内存释放,即使出现异常也是如此。
答案 1 :(得分:1)
&#34;指针发布后的内存消耗与发布之前的内存相同&#34;。这不是指示性的,free
的许多实现通常不会将内存返回给操作系统,而是“#34; recycle&#34;它用于未来的分配。请参阅this question。