3

少なくとも私は少し混乱しています。getaddrinfo() 呼び出しは addrinfo 構造体へのポインタを「更新」します。同じスコープ (その関数) で addrinfo を使用する場合はすべて問題ありませんが、構造体を別のものにコピーするとどうなりますか (それを割り当てることによって)。

進行中の基本を理解するのを手伝ってください(代替アプローチのアドバイスは求めていません)。

間違っていたら訂正してください: a) getaddrinfo() には addrinfo への構造体ポインタへのポインタが必要です。b) getaddrinfo は、現在の関数スコープで addrinfo 構造体を作成し、a) で必要なポインターを更新します。

ここで私の本当の質問: その addrinfo を別の場所に保存したいと思います。他のポインターへの代入を使用してもディープ コピーは実行されず、関数の後ですべてのポインターが無効になりますか?

非常に単純化された例を挙げてください。

void GetAddrInfo(struct addrinfo *update)
{
    struct addrinfo *res;
    getaddrinfo(xx,xx,xx,&res);

    //is this save? After this 'scope' ends all pointed fields are invalid?
    //this doesn't copy the linked list ai_next.
    *update=*res; 
}

問題が残っているため、getaddrinfo で &update を直接使用しても機能しないようです。元の構造体は関数スコープの終了後に破棄されます。

ここでより多くの洞察を得ることができる人は誰でも(何がどこで作成され、どこで破棄されるか、スタック、すべての情報をヒープすることを歓迎します)

4

2 に答える 2

6

関数スコープが終了した後、元の構造体は破棄されます

いいえ、構造体のポインターは破棄されます。残りのデータはまだヒープにあります。freeaddrinfo()結果の処理が終了したときに呼び出さないと、メモリ リークが発生します。

その addrinfo を別の場所に保存したい

データはまだ存在するので、自由にポインタをコピーしてください。ディープコピーは必要ありません。あなたの例から:

void GetAddrInfo(struct addrinfo **update)  /* pointer to pointer */
{
    struct addrinfo *res;
    getaddrinfo(xx,xx,xx,&res);
    *update=res;  /* save the pointer to the struct */
}

この関数を次のように呼び出すだけです。

struct addrinfo *mycopy;
GetAddrInfo(&mycopy);
于 2011-03-24T18:42:09.653 に答える
1

getaddrinfo構造体のリストを割り当て、リストのaddrinfo先頭へのポインターを提供します。使い終わったら、このポインタをfreeaddrinfoに渡すことで、割り当てられたすべてのメモリを解放します。

あなたがしていることは十分に安全ですが、メモリリークが発生します。

void GetAddrInfo(struct addrinfo **update)
{
    getaddrinfo(xx,xx,xx,update);
}


addrinfo * myai;
GetAddrInfo(&myai);
freeaddrinfo(myai)

このアプローチではメモリ リークは発生しません。addrinfo リスト ヘッドへのポインタを取得しているだけです。

于 2011-03-24T18:35:56.083 に答える