gpt4 book ai didi

c++ - std::shared_ptr(new DerivedType(...)) != std::make_shared(DerivedType(...))?

转载 作者:行者123 更新时间:2023-11-28 06:26:14 26 4
gpt4 key购买 nike

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

当我创建 DerivedType带有 std::make_shared<type>(DerivedType(...)) 的指针它只能作为 Type 来处理而不是 DerivedType .

然而当我使用语法 std::shared_ptr<Type>(new DerivedType) vfptr表列出了正确的条目,它可以转换为 DerivedType没有问题。

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

感谢您的帮助。卢克

最佳答案

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

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' s 基础部分。一个普通的 Type 对象被实例化并指向。原始的 DerivedType 消失了。这个问题作为一个整体被称为切片

* 关于异常安全的注意事项: 如果您使用以下形式的函数:

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

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

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

... 可能会泄漏,例如,调用 new A,然后调用 new B,后者抛出异常。 A 还没有被包装成智能指针,并且是不可恢复的。

关于c++ - std::shared_ptr<type>(new DerivedType(...)) != std::make_shared<type>(DerivedType(...))?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28490648/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com