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