代码堆损坏
Heap corruption in code
根据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: %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。
相关文章:
- C++:此代码可以编译,但引发运行时检查失败 #2 - 围绕变量周围的堆栈'num'已损坏。发生
- 从本机代码返回到托管代码会损坏返回的对象
- 增强Dijkstra代码会导致片段内存损坏
- 获得MAC地址的代码似乎会损坏内存,但仅在发布构建中而不是调试构建
- C#到C代码P/调用多个std:字符串声明导致堆栈损坏
- 执行试图访问同一寄存器的汇编代码,在不同线程中损坏任何东西
- 示例提供的代码上的Qt堆损坏
- 无法理解工作代码和损坏代码之间的区别
- Bii 代码似乎损坏了我的 cmake
- C++ 代码损坏(开关数量不是整数)
- 使用库中的代码时,变量周围的堆栈已损坏
- 损坏调用堆栈的 C/C++ 代码
- 此代码生成错误的原因:堆已损坏
- 代码堆损坏
- 尝试运行代码时堆已损坏
- glibc在运行C++代码时检测到*双自由或损坏错误
- 使用DLL代码时堆损坏
- 为什么这段代码(malloc)不会产生堆损坏
- 0xc0000374未附加调试时Cli/Cpp代码堆损坏
- 在 ARM 处理器上运行 pcl::MovingMinimumSquares 代码时出现双释放或损坏运行时错误