看看这段代码:
Foo &Bar::Copy()
{
return Bar();
}
类Bar继承自Foo,而Foo是一个抽象类。但是当我打电话给Bar()
并将其归还时,这样做是否安全?或者我会返回一个局部变量的地址,该变量将被Copy()
函数的末尾释放?
非常感谢建议!
答案 0 :(得分:1)
调用Bar();
时,在对其返回引用的隐式临时对象上调用构造函数。如果您打算创建类似Clone()
的函数,则典型的解决方案是使用new
在堆上创建克隆。您可以使用一种智能指针来简化生命周期管理。在某些情况下,您还可以使用协变返回类型来避免类型转换:Bar &Bar::Copy()
答案 1 :(得分:1)
你没有回复ctor。 Bar();
调用 ctor,创建一个临时对象。然后,您将返回对该临时对象的引用。
由于C ++中的ctor没有名称,因此无法在常规函数上执行许多常用操作,例如获取/返回指向函数的指针。现在还不完全清楚你在这里想要完成什么,但是如果你想返回一些会构造一个对象的东西,你通常需要定义一个调用ctor的静态成员函数,并返回一个指向该静态成员函数的指针
答案 2 :(得分:0)
这是一种未定义的行为,因为临时Bar
对象将在;
被销毁。
Foo Bar::Copy()
{
return Bar();
}
更安全。但是感谢@Cat Plus Plus和@celtschk,我意识到这种方法会导致切片,丢失所有Bar
特定信息。为了保持Bar
对象Copy()
必须返回引用或指向对象的指针。在这里,我们再次开始,因为这是UB。因此,Bar
必须动态分配,其引用/指针位于Copy()
函数之外。谁应该负责删除这个动态生成的Bar
对象?
#include <memory>
std::shared_ptr<Foo> Bar::Copy()
{
return std::shared_ptr(new Bar());
}
shared_ptr
会自动为您执行此操作。