Chinaunix首页 | 论坛 | 博客
  • 博客访问: 988589
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-23 16:36:40

#include <iostream>
using namespace std;

struct A
{
    A() 
{ cout << "A()" << endl; }
    
//A( const A& ) { cout << "A(A)" << endl ;}
    A& operator=const A&  ) { cout << "A=A" << endl; }
    
~A() { cout << "~A()" << endl; }
}
;

A foo( A a )
{
    cout 
<< "---" << endl;
    
return a;
}


int main(void)
{
    
{
        foo( A() );
    }


    system( 
"pause" );
    
return 0 ;
}


在 VC++2005 下输出为:
A()
---
~A()
~A()
~A()

为什么 return a; 会调用2次析构函数?


---------------------------------- 简化一下----------------------------------
#include
using namespace std;

struct A
{
    A() { cout << "A()" << endl; }
    //A( const A& ) { cout << "A(A)" << endl ;}
    A& operator=( const A&  ) { cout << "A=A" << endl; }
    ~A() { cout << "~A()" << endl; }
};

void foo( A a )
{
}

int main(void)
{
    {
        foo( A() );
    }

    system( "pause" );
    return 0 ;
}

VS2005中的怪异现象描述:

如果没有 A( const A& ) { cout << "A(A)" << endl ;}
那么输出
A()
~A()
~A()

如果加上 A( const A& ) { cout << "A(A)" << endl ;}
那么输出
A()
~A()
阅读(3250) | 评论(20) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-23 16:38:44

pcasa
我猜想可能是出于代化的考虑吧,
连续两次执行call        A::~A (41114Ah) ,
VC2008也是一样
{
foo( A() );
0041167D  lea         ecx,[ebp-0DDh]  
00411683  call        A::A (411122h)  
00411688  mov         dword ptr [ebp-0E8h],eax  
0041168E  mov    

网友评论2012-11-23 16:38:34

周星星
foo (A());这里A()会产生一无名对象,由于参数不是引用传递,所以用完就析构了.
------ 如果这样的话,那就应该是
A()
~A()
---
~A()
~A()

另外,如果将 //A( const A& ) { cout << "A(A)" << endl ;} 前的//去掉,它就正常了;
还有,无论代码怎么写,其他编译器(比如g++)是正常的

网友评论2012-11-23 16:38:24

sjdev
foo (A());这里A()会产生一无名对象,由于参数不是引用传递,所以用完就析构了.同样,因为不是引用传递,所以需要产生一个无名对象的copy.在foo()调用结束后,又返回了一个.

网友评论2012-11-23 16:38:17

周星星
"foo()的参数变量a 的析构" 我已经算上了呀,它一共有三次析构

网友评论2012-11-23 16:38:10

pcasa
一次是foo()的参数变量a 的析构
另一次是foo()返回值的析构