1

メモリ アロケータを作成していますが、メモリのチャンク内に整数を格納する方法が必要です。この整数はブロックのサイズを表すため、先頭へのポインターを指定して末尾に移動できます。

これが私のテスト例です:

// 編集: testInt int* testInt = new int の宣言されたスペース。

head_ptr = (char*) malloc(4*1024*1024); // Allocate 4MB

// EDIT: Should have used std::fill and std::copy
memset(head_ptr,23,sizeof(int)); // Set Address head_ptr = 12345

memcpy(testInt,head_ptr,sizeof(int)); // Set testInt = head_ptr

printf("testInt = %i",testInt);

これにより、最後から 2 番目の行でセグメンテーション違反がスローされます。

私がやろうとしていることは理にかなっていますか?

もしそうなら、正しいアプローチは何ですか?

お世話になりました皆様、本当にありがとうございました!! 問題が解決しました :-)

4

5 に答える 5

5

元の質問への回答

memset(head_ptr,12345,sizeof(int)); // Set Address head_ptr = 12345

いいえ、そうではありません。これにより、 の最初のsizeof(int)バイトがhead_ptr12345 に設定され、オーバーフローします (1 バイトが 8 ビットを超えるアーキテクチャを使用している場合を除く)。

memcpy(testInt,head_ptr,sizeof(int)); // Set testInt = head_ptr

testInt とは何ですか? int*? イント?後者の場合、&testInt を使用します。

また、タグから、C ではなく C++ を使用しているように見えます。しかし、コードは実際には単なる C です。実際には、より安全な C++ 関数と機能を使用する必要があります。

  • memset -> std::fill
  • memcpy -> std::copy
  • malloc -> 新規
  • printf -> cout または (より良い) Boost::Format

編集への回答

int* testInt;整数変数へのポインターですが、初期化されていません。ランダムなメモリ領域を指します (そうでない場合でも、すべての意図と目的のために「ランダム」と見なすことができます)。

memcpy次に、おそらくアクセスできないこのランダムなメモリ領域に書き込もうとするため、セグメンテーション違反が発生します (つまり、「このメモリ領域にアクセスできない」ことを意味します)。

于 2010-04-01T02:40:25.963 に答える
2

memset(3)との不適切な使用について他の人がコメントしたmemcpy(3)ので、アロケータの問題に返信します。

C++ でカスタム メモリ アロケータを構築するビジネスに実際に取り組んでいる場合は、Alexandrescu のModern C++ Designの Chapter 4 を参照してください。スモール オブジェクト アロケータの実装について詳しく説明します。コードはLoki Libraryの一部として入手できます。

男、誰かがユニコーンが好きです... :)

于 2010-04-01T02:55:20.793 に答える
2

testInt を初期化したことがないため、memcpy 呼び出しは誰がどこにいるかを知っている人に書き込んでいます。

これを試して:

int *testInt = malloc(sizeof(int));

于 2010-04-01T02:42:31.523 に答える
1

何が何であるかを確認できなければ、確信が持てませんが、私の精神的なデバッグ能力は、 への引数としてそれ自体ではなくtestIntのアドレスを取得する必要があることを示しています。testInttestIntmemcpy

EDIT:あなたが今投稿したものを見て、testIntそれを使用する前にメモリを割り当てる必要があります.

于 2010-04-01T02:41:16.173 に答える
1

testInt が単なる「int」である場合、値で渡しているため、変更されていない可能性がありますか?

于 2010-04-01T02:42:21.270 に答える