如果我在堆栈上声明了一个对象,并且返回了对它的引用,我相信我将不能再访问它了,因为它超出了范围。对,是这样?
如果我只是返回对象本身(而不是对它的引用),该怎么办?复制构造函数会被调用吗?(我听说过“移动构造器”一词,但据我所读,它似乎是一个新特性。有人能详细说明一下吗?)
在何种情况下将调用析构函数?
发布于 2014-03-22 20:04:55
如果我在堆栈上声明了一个对象,并且返回了对它的引用,我相信我将不能再访问它了,因为它超出了范围。对,是这样?
正确,当析构函数超出作用域时将被调用。
如果我只是返回对象本身(而不是对它的引用),该怎么办?复制构造函数会被调用吗?
可以调用复制构造函数和析构函数,但编译器通常会执行返回值优化,而不会进行复制、析构或移动。
要了解移动构造函数,请阅读移动语义和rvalue引用。
发布于 2014-03-22 20:01:49
如果我在堆栈上声明了一个对象,并且返回了对它的引用,我相信我将不能再访问它了,因为它超出了范围。对,是这样?
正确的,许多编译器也会给你警告。
如果我只是返回对象本身(而不是对它的引用),该怎么办?复制构造函数会被调用吗?
它将调用复制构造函数。标准数组中没有定义为内部定义的std::move构造函数,它使用堆栈内存。因此,将调用复制构造函数。
在何种情况下将调用析构函数?
在这两种情况下,析构函数都会被调用。只是在移动构造函数之后,我们将所有指针/句柄移动到其他对象,因此对象状态为空(但一致)。
发布于 2014-03-22 20:07:06
编译器将尝试优化这些函数,以消除复制操作。生成的代码将表现为在函数以适当的生存期返回对象时创建对象。参考这里。这取决于编译器,以及代码本身在构造点和使用点的结构。优化也可能是不可能的,在这种情况下,可能会调用复制或移动构造函数(如果可用的话)。
如果编译器优化了函数,那么当使用点处的对象超出最近的块范围时,将调用析构函数。
如果没有优化,则在使用点将对象复制到另一个对象(一个调用复制/移动构造函数),然后函数中的对象将被销毁(如果被复制),最后,当该对象在函数返回的位置(use )走出最近的块作用域时,将调用它的析构函数。
但是,如果您从函数返回一个临时的,那么您将返回一个引用或指针来破坏内存,因为您的临时函数在函数返回时将超出作用域并被销毁。
https://stackoverflow.com/questions/22582813
复制相似问题