返回本地实例时未调用析构函数

Yan*_*Xie 8 c++ destructor return

可能重复:
为什么析构函数没有从函数中调用返回的对象?

我写了一些C++代码(下面),用GCC 4.6编译它并成功运行.但是我不知道为什么classA在返回时没有调用析构函数createA().

既然ca是一个局部变量createA()(即在堆栈上),我认为从函数返回时应该调用它的析构函数.但事实上,析构函数只在从main函数返回时被调用一次.

此外,返回本地实例总是在此测试中正常工作.我想知道在返回后弹出帧时是否可以安全地返回堆栈帧上的本地实例.

这是我的代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*ore 14

这称为返回值优化.

简而言之,编译器不必返回对象的副本来优化代码.

因为ca是局部变量,即在堆栈上[...]

不必要.ca可以直接在调用上下文中创建,以防止额外的副本.复制省略是编译器可以自由执行的唯一可以改变预期行为的优化.

  • @CookSchelling它非常安全.如果您通过引用返回它将是不安全的. (2认同)