当我运行我的程序时,它可以运行一段时间,然后突然发生巨大的内存泄漏。当它崩溃时,我使用堆的快照来追踪它,我有一个神秘的 char[],大小为 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[] 是否可能指向另一个问题?
最佳答案
假设这里的string
是std::string
:
您调用 string(buffer)
,它假定 buffer
以 0 结尾并分配一个新字符串。但是您的代码无法确保 buffer
实际上以 0 结尾,因此这可能会导致未定义的行为,包括可能崩溃或为字符串分配过多内存。
您可能想改用 string(buffer, size)
构造函数,它不需要 buffer
以 0 结尾。
我还建议避免手动new
/delete
。一种方法是创建一个空字符串,并将您读取的字符push_back
。这避免了对 buffer
的需要。
关于c++ - 内存泄漏(字符[]),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44936891/