首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于C++函数返回值初始化对象后是不是被析构

2013-08-01 
关于C++函数返回值初始化对象后是否被析构?代码如下:#include iostreamusing namespace stdclass B{pub

关于C++函数返回值初始化对象后是否被析构?
代码如下:

#include <iostream>
using namespace std;

class B
{
public:
B() { cout << "default constructor called." << endl;}
B(int i) : x(i) { cout << "parameter constructor called. " << i << endl;}
~B() { cout << "deconstructor called." << endl;}
void setX(int i) { x = i;}
int getX() const { return x;} 
private:
int x;
};

B func(B b)
{
return b;
}

int main()
{
B temp = func(7);
}


一般来说,应该会有三次析构函数的调用:第一次是func函数返回时析构b;第二次是“B temp = func(7)”执行完后析构func函数的返回值,这是个临时对象;第三次是析构temp对象,发生在main函数返回前。按照这个框架应该会有三条"deconstructor called.",但不知为什么在g++(v4.6.2)和vc2010上都只有两条,求真相!!! C++ 析构 函数返回值
[解决办法]
http://en.wikipedia.org/wiki/Return_value_optimization
[解决办法]
$ cat main.cpp ; g++ -fno-elide-constructors main.cpp  -o demo.exe; ./demo.exe
#include <iostream>
using namespace std;

class B
{
public:
        B() { cout << "default ctor: " << this<< endl;}
        B(int i) : x(i) { cout << "parameter ctor: " << this << endl;}
      B(B const&){cout << "copy ctor " << this << endl;}
      B & operator = (B const&){cout << "copy ctor " << this << endl;return *thi
s;}
        ~B() { cout << "dtor:" << this << endl;}


        void setX(int i) { x = i;}
        int getX() const { return x;}
private:
        int x;
};

B func(B b)
{
        return b;
}

int main()
{
        B temp = func(7);
}

parameter ctor: 0x22ff0c
copy ctor 0x22ff08
copy ctor 0x22ff04
copy ctor 0x22ff00
dtor:0x22ff04
dtor:0x22ff08
dtor:0x22ff0c
dtor:0x22ff00

热点排行