0

std::list を含む構造が定義されています。私のコードでは、このリストを繰り返し処理しようとしていますが、奇妙な結果が得られます。

struct my_struct_t {
    std::list<int> my_list;
    //More fields
};

これは、ヘッダー ファイルで定義されている私の構造です。

このヘッダーを含むファイルのサンプル コードは次のようになります。

    std::list<int>::iterator my_iterator;

    struct my_struct_t* test_struct = (struct my_struct_t*) malloc(sizeof(struct my_struct_t));
    my_iterator = test_struct->my_list.begin();
    printf("Beginning of list address: %p\n", my_iterator);

    my_iterator = test_struct->my_list.end();
    printf("End of the list address: %p\n", my_iterator);
    printf("Address of the list: %p\n", &(test_struct->my_list));

このコードは正常にコンパイルおよび実行されますが、出力は次のようになります。

Beginning of list address: (nil)
End of the list address: 0x86f010
Address of the list: 0x86f010

リストは空でなければならないので、最後の 2 行は私にとって完全に理にかなっています。しかし、どのように/なぜ最初にヌルポインターを取得するのですか? どうすればこれを修正できますか?

4

2 に答える 2

8

mallocリストを初期化せずに使用することはできません。これは無効な操作です。

new適切な呼び出しで初期化されていません。これが segfault を発生させずにまったく機能することは驚くべきことです。

C++ スタイルの初期化を使用してオブジェクトを作成する必要がありますmy_struct_t。そうしないと機能しません。

もっとC++のようなものを試しましたか:

struct my_struct_t* test_struct = new my_struct_t;

freeもちろん、電話の代わりに後でdelete

于 2013-02-20T07:19:54.367 に答える
1

mallocオブジェクトに必要なメモリを割り当てるだけで、そのオブジェクトは初期化されません。C ++でのオブジェクトの初期化は、そのコンストラクターによって実行されます。C ++は、newメモリの割り当てとオブジェクトの初期化を同時に行うための演算子を提供します。したがって、あなたがすべきことは次のとおりです。

my_struct_t* x = new my_struct_t();

ここで本当に使用するつもりなら、を使用mallocして、正しく整列されたrawメモリ内のオブジェクトを適切に初期化できますplacement new。次に、デストラクタを明示的に呼び出し、メモリの割り当てを明示的に解除する必要があることに注意してください。しかし、私はこれがあなたの意図であったことを真剣に疑っています。

于 2013-02-20T07:27:35.487 に答える