Mid*_*das 1 c dynamic-memory-allocation data-structures
我正在尝试读取一个二进制文件,该文件具有以标识符开头的块(如3DS文件).我遍历文件并使用开关,程序确定块具有什么标识符,然后将数据读入文件结构.有时我需要使用malloc为动态大小的数据分配内存.在读取时,交换机经常会分配内存的相同情况,但是在文件中的特定点,它会在同一个malloc上崩溃.我想读的文件大约是1MB.但是当我用另一个大约10kB的文件和相同的结构来尝试该程序时,它会成功地读取它.
什么可能导致这个问题?
我在调试时得到的错误代码是:
Heap corruption detected at 0441F080
HEAP[prog.exe]: HEAP: Free Heap block 441f078 modified at 441f088 after it was freed
Run Code Online (Sandbox Code Playgroud)
此外,当我在调试模式下执行它时,由于某种原因,我可以从文件中读取更多数据.程序在崩溃之前会持续更长时间.
这是代码崩溃的代码:
switch (id) {
case 0x62:
case 0x63:
// ...
{
char n_vertices = id - 0x60 + 1;// just how I calculate the n_vertices from the block ID
fread(&mem.blocks[i].data.attr_6n.height, 2, 1, f);
mem.blocks[i].data.attr_6n.vertices = malloc(2 * n_vertices);// crash
for (short k = 0; k < n_vertices; k++) {
fread(&mem.blocks[i].data.attr_6n.vertices[k], 2, 1, f);// read shorts
}
}
break;
// ...
}
Run Code Online (Sandbox Code Playgroud)
你可能有一个腐败的堆.这可能是由无效的解除分配(解除分配无主或已经空闲的内存)引起的,或者是由一些随机的代码块写入其内存区域之外的一个地方,而这个地方恰好占据了堆bookeeping数据结构.这很可能是一段与动态分配的内存无关的代码.
追踪像这样的错误是一个真正的熊.它们往往会在违规代码执行后出现很长时间,而且它们有一种令人烦恼的倾向,即变成heisenbugs(当你试图调试它们时会移动或消失的bug).
我接近调试的建议是尝试注释掉部分代码,看看是什么导致问题消失.这不是万无一失的,因为你最终可能会将越界写入其他地方.
查看刚刚发布的代码,我强烈建议您做的一件事是验证您malloc指定的足够内存来保存您尝试加载到其中的所有数据.在我看来,你假设每个顶点有2个字节.这对我来说似乎有点怀疑.我不知道你的代码,但是4或8将是更常见的元素大小.无论如何,行业惯例是使用sizeof()目标类型来帮助确保您正确使用它.
另一个选项,如果您的调试器消息可以显示它发生的位置,那么在调试器中尝试时,可以在那里放置一个调试器观察点(或者编写一些观察代码......或者手动转储并检查该区域)找出哪个是有问题的代码行.
祝好运.我讨厌这些错误.