2011-05-20 150 views
2

我有一个函数返回一个本地对象:为什么我的本地对象摧毁了两次?

class AT 
{ 
public: 
    AT() { cout<<"construct"<<endl; } 

    AT(const AT& at) { cout<<"copy"<<endl; } 

    ~AT() { cout<<"destroy"<<endl; } 
}; 

AT funcAt() 
{ 
    AT tmp; 
    return tmp; 
} 
... 
funcAt(); 

输出为:

construct 
copy 
destroy 
destroy 

我想有只建设和“TMP”的破坏,所以为什么会出现复制和其他破坏?复制的对象在哪里?

+0

没有C++对象可以销毁(或创建)两次。 – 2011-05-20 17:03:33

+0

如果在启用优化的情况下运行发布版本,我将保证输出更改。 – ildjarn 2011-05-20 17:24:25

+0

@尼尔:我敢打赌,我可以创建和销毁同一个对象两次。 (作者:迂腐的警察) – 2011-05-20 17:37:03

回答

1

因为它是

1)的创建:AT tmp内部funcAt
2)复制:return tmp;,这是因为该函数返回一个拷贝:AT funcAt()
3)破坏 - 第一TMP对象,并返回复制

提示:注意在输出:)

+0

我明白你的意思,但你需要清理这个以指定两个对象正在销毁,而不是两次。 – 2011-05-20 17:03:15

+0

我的回答还没有准备好,无意中发布了。我编辑过。 – 2011-05-20 17:05:45

0

你的函数的返回值是一个单独的对象(即复制)到本地对象copy使用在函数内部。

1

为什么因为tmp的副本从funcAt返回,不存储,因此C++破坏它,并呼吁

+1

“我在任何地方都保存过”对初学者来说有点困惑,我想。它并没有真正描绘发生的事情。 – 2011-05-20 17:05:39

+0

@San我切换保存到存储。想不到比这更好的词 – JaredPar 2011-05-20 17:06:44

1

tmp构造和销毁的析构函数的原因。返回值(这是一个新的对象,而不仅仅是一个引用)也是如此,尽管这里使用了cop构造函数。您没有看到正在使用的返回值,但它仍然通过。

8

让我们充实了这一点一点:

AT funcAt() 
{ 
    AT tmp;   [1] 
    return tmp;  [2] 
}      [3] 
... 
funcAt();    [4] 

[1]在TMP
创建一个AT对象 [2]复制TMP成返回值
[3]破坏TMP
[4]破坏返回值,因为它没有被使用