首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++移动构造函数和作用域

C++移动构造函数和作用域
EN

Stack Overflow用户
提问于 2014-03-22 19:57:45
回答 3查看 325关注 0票数 1

如果我在堆栈上声明了一个对象,并且返回了对它的引用,我相信我将不能再访问它了,因为它超出了范围。对,是这样?

如果我只是返回对象本身(而不是对它的引用),该怎么办?复制构造函数会被调用吗?(我听说过“移动构造器”一词,但据我所读,它似乎是一个新特性。有人能详细说明一下吗?)

在何种情况下将调用析构函数?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-22 20:04:55

如果我在堆栈上声明了一个对象,并且返回了对它的引用,我相信我将不能再访问它了,因为它超出了范围。对,是这样?

正确,当析构函数超出作用域时将被调用。

如果我只是返回对象本身(而不是对它的引用),该怎么办?复制构造函数会被调用吗?

可以调用复制构造函数和析构函数,但编译器通常会执行返回值优化,而不会进行复制、析构或移动。

要了解移动构造函数,请阅读移动语义和rvalue引用。

票数 3
EN

Stack Overflow用户

发布于 2014-03-22 20:01:49

如果我在堆栈上声明了一个对象,并且返回了对它的引用,我相信我将不能再访问它了,因为它超出了范围。对,是这样?

正确的,许多编译器也会给你警告。

如果我只是返回对象本身(而不是对它的引用),该怎么办?复制构造函数会被调用吗?

它将调用复制构造函数。标准数组中没有定义为内部定义的std::move构造函数,它使用堆栈内存。因此,将调用复制构造函数。

在何种情况下将调用析构函数?

在这两种情况下,析构函数都会被调用。只是在移动构造函数之后,我们将所有指针/句柄移动到其他对象,因此对象状态为空(但一致)。

票数 0
EN

Stack Overflow用户

发布于 2014-03-22 20:07:06

编译器将尝试优化这些函数,以消除复制操作。生成的代码将表现为在函数以适当的生存期返回对象时创建对象。参考这里。这取决于编译器,以及代码本身在构造点和使用点的结构。优化也可能是不可能的,在这种情况下,可能会调用复制或移动构造函数(如果可用的话)。

如果编译器优化了函数,那么当使用点处的对象超出最近的块范围时,将调用析构函数。

如果没有优化,则在使用点将对象复制到另一个对象(一个调用复制/移动构造函数),然后函数中的对象将被销毁(如果被复制),最后,当该对象在函数返回的位置(use )走出最近的块作用域时,将调用它的析构函数。

但是,如果您从函数返回一个临时的,那么您将返回一个引用或指针来破坏内存,因为您的临时函数在函数返回时将超出作用域并被销毁。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22582813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档