6

質問はタイトルにあります...検索しましたが何も見つかりませんでした。


編集:

これを説明する必要はあまりありませんが、私が言っていることは意味がないと人々が考えているため(そして私が間違った質問をしている)、ここに問題があります:

人々は実際に尋ねられた質問ではなく、すべての問題の「根本的な」原因に非常に興味を持っているように見えるので(それは明らかに物事がより良く解決するのに役立つので、それが解決するかどうか見てみましょう)、ここに問題があります:

Win32サブシステム以外のサブシステムにそのライブラリを使用できるように、NTDLL.dllに基づいてDランタイムライブラリを作成しようとしています。そのため、NTDLL.dllとのみリンクする必要があります。

はい、私は機能が「文書化されていない」ことを知っており、いつでも変更される可能性があります(20年後wcstombsも同じことを行う100ドルを賭けても、それがまだ存在する場合)。はい、私は人々(特にマイクロソフト)がそのライブラリにリンクしている開発者を好まないことを知っています、そして私はおそらくここで正しいことについて批判されるでしょう。そして、はい、上記の2つのポイントは、Win32サブシステムの前に実行されるchkdskやdefragmentersのようなプログラムは、kernel32.dllやmsvcrt.dllのようなものとリンクすることが文字通り不可能であるため、そもそも作成されることさえ想定されていないことを意味します。まだNTネイティブの実行可能ファイルがあるので、開発者は、これらのステージが永遠に私たちの手の届かないところにあることを意図しているふりをする必要があります。

しかし、いいえ、ここにいる誰かが私に数千行のコードを貼り付けて、それらを調べて、失敗していないメモリ割り当てが変更しているソースコードによって拒否されている理由を理解するのを手伝ってくれるとは思えません。そのため、コミュニティではベストプラクティスとして知られていると思われますが、「根本的な」原因とは異なる問題について質問しました。

それでも意味がわからない場合は、以下にコメントを投稿してください。:)


編集2:

約8時間のデバッグの後、私はついに問題を発見しました。

与えられたポインタがであるかのように自動的に機能RtlReAllocateHeap()しないことがわかりました。RtlAllocateHeap()NULL

4

4 に答える 4

13

ブロックの先頭を指している必要があります。nullポインタをに渡すのは安全ですが、またはその親戚の1つfree()によって割り当てられていないポインタを渡すと、未定義の動作が発生します。malloc()一部のシステムでは、ランタイムエラーが発生します。これは、「ポインタの割り当てが解除されていない」という行に沿ったものです。

編集:

エラーメッセージを取得するためのテストプログラムを作成しました。私のマシンでは、このプログラム:

#include <stdlib.h>

int main(int argc, char **argv)
{
  int *x = malloc(12);
  x++;

  free(x);

  return 0;
}

このメッセージでクラッシュします:

app(31550) malloc: *** error for object 0x100100084: pointer being freed was not allocated
于 2011-01-03T22:34:16.520 に答える
4

渡すことができるのは、 (または、など)freeから返されたポインタ、または NULL だけです。malloccallocrealloc

mallocを実行する関数があり、データブロックをいじって、完了したらそれを取り除きたいので、気にしたくないので、あなたが尋ねていると思います元のポインタのコピー。そのようには機能しません。

于 2011-01-03T22:37:05.063 に答える
1

既存の回答に追加したコメントから、間違った質問をしているようです。メモリの配置が必要な場合は、その質問をしてみませんか? 認識している解決策について尋ねるのではなく、根本的な問題について質問してください。

ですから、よろしければ、あなたが尋ねるべきだった質問にお答えします。

アライメントされたメモリ割り当ては、Win32 でサポートされてい_aligned_malloc()ます。POSIXと同等ではありませんmemalign()

整列割り当ての実装が必要な場合、実装は非常に簡単です。

void* aligned_malloc( size_t size, size_t alignment )
{
    void* unaligned = malloc( size + alignment ) ;
    void* aligned = (void*)(((intptr_t)unaligned + alignment) & ~(alignment - 1));
    void** free_rec_ptr = ((void**)aligned - 1) ;
    *free_rec_ptr = unaligned ;

    return aligned ;
}

void aligned_free( void* block )
{
    void** free_rec_ptr = ((void**)block - 1) ;
    free( *free_rec_ptr ) ;
}

alignment引数は 2 の累乗でなければなりません。

于 2011-01-03T23:03:23.043 に答える
0

FWIW、最後に C ランタイム ライブラリがどのように機能するかを調べたとき、実際に提供するブロックにはmalloc、提供するポインターに対して負のオフセットで余分な単語がいくつかあります。これらは、ブロックの大きさなどを示します。それらのものを見つけることができることに頼っていました。それが光を当てるかどうかはわかりません。freemallocfree

于 2011-01-05T14:37:54.307 に答える