内存泄漏(char [])

时间:2017-07-05 22:20:08

标签: c++ memory-leaks

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

1 个答案:

答案 0 :(得分:4)

假设此处stringstd::string

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

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

我还建议您避免使用手册new / delete。一种方法是创建一个空字符串,并push_back您读取的字符。这样就不需要buffer