我知道这确实是一般的,但是当我在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()?因为我 思考 错误可能只是您忘记了 末尾的额外内存位置 - 发生的事情是,它试图写入该位置,该位置未分配给它,并假设它试图写入已经被释放的地方。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top