gpt4 book ai didi

c++ - 内存泄漏(字符[])

转载 作者:行者123 更新时间:2023-11-27 22:44:29 27 4
gpt4 key购买 nike

当我运行我的程序时,它可以运行一段时间,然后突然发生巨大的内存泄漏。当它崩溃时,我使用堆的快照来追踪它,我有一个神秘的 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[] 是否可能指向另一个问题?

最佳答案

假设这里的stringstd::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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com