其他分享
首页 > 其他分享> > c – 代码中的堆损坏

c – 代码中的堆损坏

作者:互联网

根据Visual C运行时,在析构函数中调用free时会出现堆损坏.但是我不明白为什么会有堆腐败,有人可以解释为什么吗?确切的错误是:

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

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

该类仅包含构造函数和析构函数以及私有变量FILE * target和char * 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: %s\n", 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] = '\0';
}

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;
}

解决方法:

一个肯定的问题是这段代码:

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

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

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

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

标签:c-3,heap-corruption,c,memory
来源: https://codeday.me/bug/20190723/1508882.html