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

标签 c++ memory-leaks

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

相关文章:

c++ - 在编译时使用 CRC32 算法对字符串进行哈希处理

c++ - 查找圆内网格的所有点,按范数排序

c++ - 多个父类(super class)中的多重继承、C++ 和相同方法签名

c++ - 基于 UDP 的 Asteroids 游戏待办事项 list

java - 匿名实现导致内存泄漏

c++ - flex-lexer 是用于简单正则表达式识别和替换的高性能(快速)转换器吗?

java - 我需要关闭音频剪辑吗?

main 完成后 C++ 内存泄漏?

c# - 没有足够的存储空间可用于在 Visual Studio 2008 中处理此命令

debugging - 托管堆碎片