关于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上都只有两条,求真相!!!

6 个解决方案

#1


和返回值优化有关(不属于标准,但是很多编译器都有实现)

#2


http://en.wikipedia.org/wiki/Return_value_optimization

#3


$ 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

#4


引用 3 楼 mujiok2003 的回复:
$ 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

也就是说还是g++默认进行了返回值优化?

#5


引用 4 楼 iTfky 的回复:
Quote: 引用 3 楼 mujiok2003 的回复:

$ 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

也就是说还是g++默认进行了返回值优化?

是的。 

#6


本身不就应该是2次么?

func 返回值 不就是b么?

编译器 不可能再创建一个新对象当返回值吧 效率太低了
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告