0

我还没有发现任何类似的问题:但是如果有人找到了,那就抱歉了。我一直在尝试使用它std::shared_ptr来大大简化内存管理,但是我遇到了一定是某种错误。

当我用它创建一个DerivedType指针时,std::make_shared<type>(DerivedType(...))它只能被寻址为 aType而不是 a DerivedType

然而,当我使用该语法时std::shared_ptr<Type>(new DerivedType),该vfptr表列出了正确的条目,并且可以DerivedType毫无问题地将其转换为 a。

我相信应该没有区别。这是我理解的错误吗?还是一个实际的错误?

谢谢你的帮助。卢克

4

2 回答 2

4

您必须传递给std::make_shared您将传递给类型的构造函数的参数,并且它们是forwarded
然后,您可以将结果指针隐式转换为基指针。

std::shared_ptr<Type> p = std::make_shared<DerivedType>(...);

让我们在你的问题中挖掘一下“为什么”。

std::shared_ptr<Type>(new DerivedType);

这确实有效,并且没有什么值得注意的。但是,std::make_shared通常首选,因为后者可以将std::shared_ptr的簿记数据与您的对象一起分配,因此更快、更便宜,并且异常安全*。

std::make_shared<Type>(DerivedType(...))

你看到了:它不起作用。这里发生的是您创建了一个DerivedType实例。std::make_shared愉快地将它转发给Type.
发生重载解决方案,并调用Type' 的复制构造函数(或其移动构造函数,如果可用),并引用您DerivedType的基础部分。一个普通的Type对象被实例化并指向。原作DerivedType消失。这个问题作为一个整体被称为切片

* 关于异常安全的注意事项:你应该使用以下形式的函数:

void func(std::shared_ptr<A> a, std::shared_ptr<B> b);

...像这样构造std::shared_ptrs :

func(std::shared_ptr<A>(new A), std::shared_ptr<B>(new B);

... 可能会泄漏,例如,如果new A调用 then new B,则后者会引发异常。A尚未包装到智能指针中,并且无法恢复。

于 2015-02-13T01:07:47.943 回答
-3
std::make_shared<type>(DerivedType(...))

这里替换make_shared<Type>make_shared<DerivedType>,这一切都应该工作

upd:突出显示更改

于 2015-02-13T00:50:38.370 回答