Pergunta

Sei que isso é realmente geral, mas entendo "isso" (veja abaixo) quando executo meu arquivo .c no Visual C ++ 2008 Express. Isso acontece quando eu ligo malloc (). Pegue meu trabalho sobre isso - alquei dinamicamente a memória corretamente.

Heap [code.exe]: heap: bloco de heap 211A10 grátis modificado em 211af8 depois que o Windows liberado desencadeou um ponto de interrupção no code.exe.

Isso pode ser devido a uma corrupção da pilha, que indica um bug no code.exe ou em qualquer uma das DLLs que ele carregou.

Isso também pode ser devido ao usuário pressionar F12 enquanto o código.exe tem foco.

A janela de saída pode ter mais informações de diagnóstico.

Por que recebo esse erro? O que isso significa?

Foi útil?

Solução

A mensagem de erro diz exatamente por que você conseguiu:

Bloco de heap 211A10 grátis modificado em 211af8 depois de ser libertado

Você tinha um bloco alocado heap que foi libertado, então algo escreveu para essa área de memória. Não é bom escrever para um bloco de memória libertado.

Outras dicas

O erro não é realmente acontecendo Quando você liga para Malloc; É exatamente quando desencadeia uma varredura grátis. O erro real aconteceu em algum lugar antes. Você Malloced alguma memória no endereço 211A10 (foi o que Malloc voltou para você). Então você (ou algum outro Lib) o libertou. Mais tarde, quando você liga para o Malloc no modo de depuração, ele digitaliza toda a pilha - como uma cortesia para você, o pobre programador. Ele descobre que alguém (seu ou algum Lib que você liga) escreveu sobre parte dessa matriz, especificamente no endereço 211AF8 ou 0xe8 bytes na matriz. Então, você ainda está pendurado em um ponteiro que foi libertado (provavelmente) e usá -lo, ou está apenas destruindo a memória aleatória.

No meu caso, com sintomas semelhantes, o problema foi a incompatibilidade de alinhamento da estrutura (//ZP)

Defini para o meu código um alinhamento de estrutura diferente das bibliotecas externas (WXWidgets). No entanto, o WXWidgets foi construído com o Makefile, por isso foi compilado usando o Defaut /ZP. E o wxwidget está estaticamente vinculado.

Você pode fazer isso, mas se você tentar excluir um objeto WxWidgets-Class do seu código O compilador fica confuso sobre o tamanho exato dos membros da estrutura. E ao correr, você recebe esta mensagem:

HEAP[Code.exe]: HEAP: Free Heap block 211a10 modified at 211af8 after it was freed 
Windows has triggered a breakpoint in Code.exe.

Solução:

  • Certifique -se de usar o mesmo "alinhamento do membro da estrutura" em todos os códigos e bibliotecas.

  • A melhor regra é definir /zp para usar o valor "padrão". No Visual Studio, em Propriedades C/C ++ Generation

  • MSDN Cite: "Você não deve usar esta opção, a menos que tenha requisitos específicos de alinhamento." Veja aqui

  • Dica: Use #pragma pack Se você precisar controlar o alinhamento em algumas estruturasVeja lá

Exemplo:

#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

*

Espero que essa explicação ajude, porque isso não é realmente um bug no código, mas um erro de configuração grave: difícil de detectar porque está localizado em opções sutis do compilador. Obrigado por todos,

    *

Eu alocarei a memória dinamicamente corretamente.

Eu acho que o problema aqui é que você não aloca a memória de maneira apropriada. O que quero dizer com isso é que você pode estar tentando usar a memória liberada. Desculpe, não posso ajudar mais, você provavelmente poderia adicionar o código real.

Pegue meu trabalho sobre isso - alquei dinamicamente a memória corretamente.

Mas tem certeza de que seus buffers são todo o tamanho correto e você free() eles corretamente? Frees duplos e transbordamentos de buffer podem facilmente levar à corrupção da pilha que pode causar malloc() falhar de todas as maneiras.

Se as estruturas de gerenciamento usadas internamente por malloc() Seja danificado, geralmente não levará a um erro imediatamente. Mas depois chama para malloc() ou free() Essa tentativa de usar essas estruturas danificadas falhará, faça coisas irregulares.

Você está usando MALLOC () em uma matriz? Porque eu acho O erro pode ser você esquecer de alocar um Localização extra de memória no final - O que acontece é que ele tenta escrever para esse local, que não é alocado a ele, e assume que está tentando escrever para um lugar que já foi libertado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top