请看下面的代码:
Foo &Bar::Copy()
{
return Bar();
}类Bar继承自Foo,而Foo是一个抽象类。但是当我调用Bar()并返回它时,这样做安全吗?或者,我是否会返回一个局部变量的地址,该变量将在Copy()函数结束时释放?
非常感谢您的建议!
发布于 2011-11-16 00:42:19
在调用Bar();时,您可以在隐式临时对象上调用构造函数,引用将返回到该对象。如果您打算创建一个类似Clone()的函数,一个典型的解决方案是使用new在堆上创建克隆。您可以使用一种智能指针来简化生命周期管理。您还可以应用协变返回类型,以避免在某些情况下使用signature:Bar &Bar::Copy()进行类型转换
发布于 2011-11-16 00:46:16
你不会返回一个ctor。Bar();调用ctor,创建一个临时对象。然后返回一个对临时对象的引用。
因为C++中的ctor没有名称,所以您不能像在普通函数上那样做许多常见的事情,例如获取/返回指向函数的指针。这里并不完全清楚你真正想要完成的是什么,但是如果你想返回一些构造对象的东西,你通常需要定义一个静态成员函数来调用ctor,并返回一个指向这个静态成员函数的指针。
发布于 2011-11-16 00:14:46
这是一种未定义的行为,因为临时Bar对象将在;中被销毁。
Foo Bar::Copy()
{
return Bar();
}更安全。但是多亏了@Cat Plus和@celtschk,我意识到这种方法会导致切片,丢失所有Bar特定的信息。为了保留Bar对象,Copy()必须返回指向该对象的引用或指针。在这里,我们再次开始,因为这是UB。因此,必须动态分配Bar,使其引用/指针位于out of Copy()函数中。谁应该负责删除这个动态生成的Bar对象?
#include <memory>
std::shared_ptr<Foo> Bar::Copy()
{
return std::shared_ptr(new Bar());
}shared_ptr将自动为您完成此操作。
https://stackoverflow.com/questions/8139408
复制相似问题