8

重複の可能性:
関数から返されたオブジェクトに対してデストラクタが呼び出されないのはなぜですか?

いくつかのC++コード(以下)を作成し、GCC 4.6でコンパイルすると、正常に実行されました。classAしかし、から戻ったときにのデストラクタが呼び出されない理由はわかりませんcreateA()

caは(つまりスタック上の)ローカル変数なのでcreateA()、関数から戻るときにそのデストラクタを呼び出す必要があると思います。ただし、実際には、main関数から戻るときにデストラクタが呼び出されるのは1回だけです。

さらに、このテストでは、ローカルインスタンスを返すことは常に正常に機能します。フレームが戻った後にポップアウトされたときに、スタックフレーム上のローカルインスタンスを返すのは安全かどうか疑問に思います。

これは私のコードです:

#include <iostream>
#include <string.h>

class classA
{
public:
    classA() { len = 0; v = 0; }

    classA(int a)
    {
        len = a;
        v = new int[a];
        for (int i = 0; i < a; i++)
            v[i] = 2*i;
    }

    ~classA()
    {
        if (v)
            {
            memset(v, 0, len * sizeof(int));
            delete [] v;
        }
    }

    int *v;
    int len;
};

classA createA(int a)
{
    classA ca(a);
    return ca;
}

using namespace std;

int main()
{
    int a = 10;
    classA ca = createA(a);
    classA *pca = &ca;
    for (int i = 0; i < a; i++)
        cout << pca->v[i];
    cout << endl;
    return 0;
}
4

1 に答える 1

14

これは、戻り値の最適化と呼ばれます。

つまり、コンパイラは、コードを最適化するためにオブジェクトのコピーを返す必要はありません。

caはローカル変数、つまりスタック上にあります[...]

必ずしも。ca余分なコピーを防ぐために、呼び出し元のコンテキストで直接作成できます。コピーの省略は、コンパイラが自由に実行できる唯一の最適化であり、予想される動作を変更する可能性があります。

于 2012-06-18T06:42:29.127 に答える