使shared_ptr拥有现有指针的更简单方法

0 c++ memory memory-management shared-ptr c++11

许多程序员提倡使用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;
}
Run Code Online (Sandbox Code Playgroud)
Foo::Foo()
Foo::Foo(Foo &&)
42 1
Foo::~Foo()
42 42
Foo::~Foo()
Run Code Online (Sandbox Code Playgroud)

什么是有一个更简洁的方式shared_ptr自己现有的指针?

Yak*_*ont 6

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

您的使用不是预期用途,并且非常危险,因为您已隐式创建了一个保证,即您传递给共享指针的数据将持续与共享指针或其副本一样长,然后无法强制执行该保证在任何有意义的意义上

如果您将共享指针传递给某个函数,则它有权缓存该副本,并在15分钟后使用它.如果您没有将共享指针传递给函数,则不需要.

通常,如果一个函数打算以难以预测的方式延长其参数的生命周期,那么它应该只需要一个共享指针.因此,如果你有一个带有共享指针的函数并且永远不会延长它的生命周期(或指向它的指针的生命周期),那么它不应该采用共享指针.问题在于你正在调用的函数,而不是你必须跳过箍来调用它.

只有当你们都有一个破碎的功能,并且无法修复它Foo在免费商店上制作副本时,这个功能过于昂贵,你的技术是否值得尝试.无论如何,这应该是极端的角落案件.