题
我知道这确实是一般的,但是当我在Visual C ++ 2008 Express中运行.c文件时,我会得到“此”(见下文)。当我打电话时发生 malloc ()
. 。对此进行工作 - 我会动态分配记忆。
堆[Code.exe]:堆:释放Windows触发了Code.exe中的断点后,在211AF8修改了Free Heap Block 211a10。
这可能是由于堆的损坏,这表明code.exe中的错误或已加载的任何DLL。
这也可能是由于用户按F12进行焦点而构成的。
输出窗口可能具有更多的诊断信息。
为什么我会得到这个错误?这甚至意味着什么?
解决方案
错误消息确切地告诉您为什么要得到它:
释放后在211af8修改的免费堆块211a10
您有一个分配的堆积,然后释放了一些东西,然后写信给那个记忆区域。写信给释放的记忆并不好。
其他提示
错误实际上不是 发生 当您致电Malloc时;那就是它触发免费的堆扫描的时候。实际错误发生在以前的某个地方。您在地址211a10上杂乱无章(这就是Malloc返回给您的)。然后,您(或其他某些Lib)将其释放。然后,当您以调试模式致电Malloc时,它会扫描整个堆 - 作为对您的糟糕程序员的礼貌。它发现某人(您或您称之为您的LIB)在该数组的一部分上写了一篇文章,特别是在地址211af8或0xE8字节中写入数组中。因此,您要么仍然挂在被释放(很可能)并使用它的指针上,要么您只是在浪费随机内存。
就我而言,有类似症状,问题是结构对齐不匹配(/ZP选项)
我为代码定义了与外部库(WXWIDGETS)不同的结构对齐。但是,WXWIDGETS是使用Makefile构建的,因此使用Defaut /ZP编译。 WXWIDGET是静态链接的。
您可以做到这一点,但是如果您尝试删除WXWIDGETS级对象 从您的代码 编译器对结构成员的确切大小感到困惑。运行时,您会收到此消息:
HEAP[Code.exe]: HEAP: Free Heap block 211a10 modified at 211af8 after it was freed
Windows has triggered a breakpoint in Code.exe.
解决方案:
确保在所有代码和库中使用相同的“结构成员对齐”。
最好的规则是定义 /ZP使用“默认”值。在Visual Studio中,属性C/C ++代码生成
MSDN引用:”除非有特定的对齐要求,否则您不应使用此选项。" 看这里
提示:使用 #Pragma Pack 如果您需要控制某些结构中的对齐看那边
例子:
#pragma pack(1) // - 1 byte alignment
typedef union
{
u64 i;
struct{ // CUSTOMS.s is used by Folders
u32 uidx; // Id, as registered
byte isoS, isoT; // isoS/isoT combination.
byte udd0, udd1; // custom values (TBD)
}s;
}CUSTOMS;
struct Header // exactly 128 bits
{
u32 version;
u32 stamp; // creation time
CUSTOMS customs; // properties
}
#pragma pack() // this pragma restores the **default** alignment
*
希望这种解释会有所帮助,因为这实际上不是代码中的错误,而是一个严重的配置错误:很难检测到,因为它位于微妙的编译器选项中。谢谢你们,
-
*
我正确地分配了内存。
我认为这里的问题在于您将内存不合格。我的意思是,您可能正在尝试使用释放记忆。抱歉,我无能为力,您可能可以添加实际的代码。
对此进行工作 - 我会动态分配记忆。
但是,您确定您的缓冲区都是正确的尺寸吗? free()
他们正确?双释放和缓冲区溢出很容易导致堆的损坏,这可能会导致 malloc()
以各种方式失败。
如果管理结构在内部使用 malloc()
损坏,通常不会立即导致错误。但是后来打电话给 malloc()
或者 free()
尝试使用这些损坏的结构会失败,这会使事情不稳定。
您是否在数组上使用malloc()?因为我 思考 错误可能只是您忘记了 末尾的额外内存位置 - 发生的事情是,它试图写入该位置,该位置未分配给它,并假设它试图写入已经被释放的地方。