1

次のコードでは、Doug Lea のmalloc.cmalloc.hを使用しています。

#include <stdio.h>
#include <string.h>
#include "dlmalloc.h"

#define USE_DL_PREFIX

int main() 
{
    char *test = dlcalloc(5, 1);

    strcpy(test, "helloextra");    
    dlfree(test);                  /* Shouldn't this crash? */

    printf("%s", test);

    return 0;
}

そしてtest正しく印刷されます!誰か説明してくれませんか?このmallocを正しく調整していないと思います。誰かが以前にこの問題を抱えていましたか?

この問題が発生した後、Doug Lea の malloc を使い始めました。

4

3 に答える 3

3

あなたのコードにはで未定義の動作がありstrcpy()ます。クラッシュすることは許可されていますが、必須ではありません。

基本的に、動作が未定義になると、何でも起こります。

于 2013-03-07T08:39:51.150 に答える
1

メモリを解放するとコンテンツが無効になることを期待していると思いますが、そうではありません。あまりにも効率が悪いでしょう。(膨大な量のメモリを考えてください)

メモリのブロックが (再び) 「malloc で使用可能」とマークされているため、他のプロセスが書き込みを行っている間はいつでも内容が変更される可能性があります。行動"。

メモリを無効にしたい場合は、memsetを見てください

于 2013-03-07T08:40:43.657 に答える
1

クラッシュさせたい場合は、リンク先の malloc.h から抜粋したものに従って、FOOTERS を定義します

FOOTERS が定義されている場合、範囲チェックに加えて、inuse チャンクのフッター フィールドも検証します。これ により、malloc/free を制御する mstate が無傷で
あることを保証できます。

一見すると、バッファ オーバーランが発生した場合はを呼び出す必要があります。dlfreeabort()

于 2013-03-07T09:00:00.317 に答える