内存泄漏(字符[])

Memory Leak (char[])

本文关键字:字符 泄漏 内存      更新时间:2023-10-16

当我运行我的程序时,它可以运行一段时间,然后突然之间,它经历了巨大的内存泄漏。当它崩溃时,我使用堆的快照对其进行了跟踪,我有一个大小为 232,023,801 字节的神秘字符[]。在此之前,崩溃前几分钟没有异常行为。我使用 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[] 是否可能指向另一个问题?

假设这里的stringstd::string

调用string(buffer)假定buffer以 0 结尾并分配一个新字符串。但是你的代码不能确保buffer实际上是 0 终止的,因此这可能会导致未定义的行为,包括可能崩溃或为字符串分配太多内存。

您可能希望改用string(buffer, size)构造函数,它不需要以 0 结尾buffer

我还建议避免手动new/delete。一种方法是创建一个空字符串并push_back您读取的字符。这避免了对buffer的需求。