当我运行我的程序时,它可以运行一段时间,然后突然间,它会遇到巨大的内存泄漏。我在崩溃时使用堆的快照来追踪它,并且我有一个大小为232,023,801字节的神秘char []。崩溃之前的分钟在此之前没有异常行为。我使用char数组的唯一地方是以下代码:
string ReadString(DWORD64 addr) {
char* buffer = new char[128];
bool validChar = true;
for (int c = 0; c < 128 && validChar; c++) {
buffer[c] = Mem.Read<char>(addr+ (0x1 * c), sizeof(char));
if (!isalnum(buffer[c]) && !ispunct(buffer[c]))
validChar = false;
}
string ret= string(buffer);
delete[] buffer;
return ret;
}
所有这些代码应该是从内存中读取一些字符,将char数组保存为字符串,清理数组并返回字符串。内存泄漏是如何从这里发生的?或者堆快照中的char []是否可能指向另一个问题?
答案 0 :(得分:4)
假设此处string
为std::string
:
您调用string(buffer)
,假定buffer
以0结尾并分配新字符串。但是您的代码不能确保buffer
实际上是0终止的,因此这可能导致未定义的行为,包括可能崩溃或为字符串分配太多内存。
您可能希望使用string(buffer, size)
构造函数,而不需要buffer
以0结尾。
我还建议您避免使用手册new
/ delete
。一种方法是创建一个空字符串,并push_back
您读取的字符。这样就不需要buffer
。