1

関数内で unordered_set にデータを格納し、格納されているオブジェクトへのポインターを返す場合、ポインターは関数のスコープ外でも有効ですか?

例えば。

int *myFunc(){
    std::unordered_set<int> hashset;

    //add some objects
    hashset.insert(4);
    hashset.insert(5);
    hashset.insert(6);

    int *intptr = &(*hashset.insert(4)); //try to insert an object that may already be in the set, and get a pointer to the object in the set
    return intptr;
}

*intptr別の関数でアクセスしようとするとエラーになりますか? または、unordered_set のスコープが終了すると、unordered_set 内のデータの割り当てが解除されますか?

4

2 に答える 2

3

はい、あなたの例では、関数のデストラクタunordered_setが呼び出されたときに破棄されたオブジェクトを返しています。つまり、関数がそのスコープを終了したときです。

に含まれる要素unordered_setは動的に割り当てられますが (要素とは、有効なキーまたは値を含むオブジェクトを意味します)、セット自体が破棄されると、それらも破棄されます。

実際には、データにアクセスしてエラーを受け取らないようにすることもできますが、この状況は安全ではないため、考慮しないでください。それが間違っているとだけ考えてください。

必要なものを取得するには、セット内に含まれるオブジェクトの内部初期化を自分で処理する必要があります。unique_ptr<int>値を返すと、セットの破棄時に値が移動し、オブジェクトの割り当てが解除されるのを防ぐことができるためです。

于 2014-06-06T23:29:16.933 に答える
2

短い答えはイエスです。

関数が呼び出された後、ハッシュセット オブジェクト内のメモリは無効であると見なされます。したがって、そのオブジェクトの内部へのポインターを返すと、未定義の動作が発生します。

より長い答えは多分です。

ただし、そのメモリの状態は、関数が戻った後もしばらくの間、変更されないままになる場合があります。したがって、メモリが無効であっても、コードから「正しい」結果が得られる場合があります。

最も長い答えは、場合によるということです。

メモリの処理方法は、実行しているプラ​​ットフォームによって大きく異なります。メモリに制約のあるシステムは、デスクトップとは非常に異なる方法でメモリ管理を実行する場合があります。

于 2014-06-06T23:28:02.140 に答える