gpt4 book ai didi

c++ - 代码中的堆损坏

转载 作者:太空狗 更新时间:2023-10-29 19:58:45 24 4
gpt4 key购买 nike

根据 Visual C++ 运行时,在析构函数中调用 free 时会发生堆损坏。但是我不明白为什么会出现堆损坏,谁能解释一下为什么?准确的错误是:

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

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

该类仅包含构造函数和析构函数以及私有(private)变量 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: %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;
}

最佳答案

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

raw_data[size] = '\0';

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

关于c++ - 代码中的堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18237715/

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