7

私はC ++を初めて使用し、いくつかのベクトルの動作を理解するのが難しいと感じています。int の配列を返す関数を実装しようとしていましたが、次のようなベクトルを使用するための多くの提案が見つかりました。

vector<int> myFunc()
{
    vector<int> myVector;
    //add elements to vector here...
    return myVector;
}

しかし、私が知っていることから、「myVector」はスタック上に作成されたオブジェクトなので、関数が終了すると範囲外になりませんか? そのデストラクタはいつ呼び出されますか? ベクトルを返すことについて他にいくつか質問があることは知っていますが、質問が重複しないように、この特定の点を明確にする必要があります。

4

3 に答える 3

14

はいmyVector、スタックに割り当てられているため、関数が戻るとすぐに範囲外になります。でもこの場合は大丈夫!あなたの関数の署名は

vector<int> myFunc()

のコピーを返すmyVectorため、既にコピーされているため、範囲外になっても問題ありません。

ただし、次のように変更した場合

vector<int> & myFunc()

コピーしないように指示すると、破壊され、コピーせずに使用しようとするため、ダングリング参照myVectorと呼ばれる問題が発生します。myVector

于 2012-12-28T10:42:19.320 に答える
1

コードは、スタック上のインスタンスのコピーを返します。myVectorですので範囲外で削除(返却後)してもOKです。

于 2012-12-28T10:41:24.937 に答える
0

範囲外になりますが、クラスまたは構造体を返すと、コンパイラは自動的にコピーを作成するため、受信オブジェクトは元のオブジェクトのコンテンツで埋められます。

に似ている:

vector<int> a;
vector<int> b;

... fill in vector a with stuff ... 

b = a; 
于 2012-12-28T10:42:05.513 に答える