代码堆损坏

Heap corruption in code

本文关键字:损坏 代码      更新时间:2023-10-16

根据Visual C++运行时,在析构函数中调用free时存在堆损坏。但我不明白为什么会有一堆腐败,有人能解释为什么吗?精确误差为:

CRT detected that the application wrote to memory after end of heap buffer.

此外,如果我忽略这个错误,程序不会崩溃,它会继续运行,当我按下某个键时,它会返回0。

该类只包含构造函数和析构函数以及私有变量FILE* targetchar* raw_data

foo::foo (wchar_t* path)
{
    size_t size;
    target = _wfopen (path, L"rb+");
    if (!target) {
        char* error = strerror (errno);
        printf ("The file could not be opened: %sn", error);
        _exit (1);
    }
    fseek (target, 0L, SEEK_END);
    size = ftell (target);
    fseek (target, 0, SEEK_SET);
    raw_data = (char*) malloc (size);
    size = fread (raw_data, 1, size, target);
    raw_data[size] = '';
}
foo::~foo ()
{
    fclose (target);
    free (raw_data);
}
int main ()
{
    nbt* klas = new nbt (L"C:\Users\Ruben\level");
    puts ("Success?!");
    delete klas;
    getchar ();
    return 0;
}

像您一样编写NUL终止符时:

raw_data[size] = '';

您使用的字节比您分配的字节多一个。可能还有其他错误,但这一行肯定有一个错误——向未分配的内存写入是"未定义的行为",可以解释您观察到的崩溃。

一个确定的问题是这个代码:

raw_data = (char*) malloc (size);
size = fread (raw_data, 1, size, target);
raw_data[size] = '';

您无法访问raw_data[size],因为它超出了分配的大小。C/C++中的索引访问是从零开始的。因此,可以使用现有代码访问的raw_data的最后一个元素是raw_data[size-1]。为了能够将偏移size处的字节设置为零,您需要将malloc更改为:

raw_data = (char*) malloc (size+1);

由于这是一个C++应用程序,您可能希望使用流和new/delete,而不是FILE指针和malloc/free。