gpt4 book ai didi

c++ - 让 shared_ptr 拥有现有指针的更简单方法

转载 作者:太空宇宙 更新时间:2023-11-04 15:03:00 25 4
gpt4 key购买 nike

很多程序员提倡使用make_shared因为它减少了打字并减少了编程错误。然而,在某些情况下使用 shared_ptr 的构造函数是不可避免的。其中一种情况是当您有一个现有的指针时,您想要 shared_ptr拥有,因为shared_ptr<Foo>(&existing_ptr)是错误的代码。相反,您必须使用笨重的 shared_ptr<Foo>(shared_ptr<Foo>(), p) .您不仅在重复自己,而且还必须创建一个临时对象。

int main()
{
using namespace std;

Foo foo;
foo.n = 1;
{
auto ptr = make_shared<Foo>(move(foo));
ptr->n = 42;
cout << ptr->n << " " << foo.n << '\n';
}
{
auto p = &foo;
auto ptr = shared_ptr<Foo>(shared_ptr<Foo>(), p);
ptr->n = 42;
cout << ptr->n << " " << foo.n << '\n';
}

return 0;
}
Foo::Foo()
Foo::Foo(Foo &&)
42 1
Foo::~Foo()
42 42
Foo::~Foo()

有什么更简洁的方式来获得 shared_ptr拥有现有指针?

最佳答案

该构造函数的预期用途是允许共享指针指向共享指针的子对象。

您的使用不是预期用途,而且非常危险,因为您已经隐含地创建了一个保证,即您传递给共享指针的数据将持续到共享指针或其拷贝存在的时间,然后失败在任何有意义的意义上执行该保证。

如果您将一个共享指针传递给一个函数,它有权缓存一个拷贝并在 15 分钟后使用它。如果您没有将共享指针传递给函数,则不需要。

一般来说,如果一个函数打算以一种难以预测的方式延长其参数的生命周期,那么它应该只需要一个共享指针。因此,如果您有一个采用共享指针并且从不延长其生命周期(或指向它的指针的生命周期)的函数,则它不应该采用共享指针。问题在于您正在调用的函数,而不是您必须如何跳过箍才能调用它。

只有当你们都有一个功能坏了,无法修复它时,免费复制Foo商店太贵了,是你的技术值得一试。无论如何,这应该是极端的极端情况。

关于c++ - 让 shared_ptr 拥有现有指针的更简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26286237/

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