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