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

C++ 返回本地实例时未调用析构函数,c++,return,destructor,C++,Return,Destructor,可能重复: 我编写了一些C++代码(下面),用GCC 4.6编译了它,并成功运行。但是我不知道为什么从createA()返回时没有调用classA的析构函数 由于ca是createA()中的局部变量(即在堆栈上),因此我认为从函数返回时应该调用其析构函数。但实际上,当从main函数返回时,析构函数只被调用一次 此外,在这个测试中,返回本地实例总是很好。我想知道在堆栈帧上返回本地实例是否安全,因为该帧在返回后已弹出 这是我的代码: #include <iostream> #inclu

可能重复:

我编写了一些C++代码(下面),用GCC 4.6编译了它,并成功运行。但是我不知道为什么从

createA()
返回时没有调用
classA
的析构函数

由于
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;
}
#包括
#包括
甲级
{
公众:
classA(){len=0;v=0;}
甲级(国际甲级)
{
len=a;
v=新整数[a];
for(int i=0;icout这称为返回值优化

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

对于ca,它是一个局部变量,即在堆栈上[…]


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

它也属于更通用的名称:复制省略。实际上,这是RVO的一个特例,称为Re转向值优化。谢谢Grigor。我还有一个问题:如果返回本地类变量是否安全。这是技术,RVO,C++规范还是编译器优化技巧?@ CyjScEnter是完全安全的。如果引用返回的话,这将是不安全的。嗨,格里戈雷。如果我把类实例传递给函数。N