让shared_ptr拥有现有指针的更简单方法
Easier way to have shared_ptr own an existing pointer
许多程序员提倡使用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
过于昂贵时,你的技术才值得尝试。无论如何,这应该是极端的情况。
IMO你在那里做的事情不应该很容易,因为这非常危险,而且只有在高度专业化的情况下才有必要,在这种情况下,键入两次类名应该是你最不担心的。
但这里有一种稍微简洁一点的方法,可以通过使用伪deleter来实现同样的目的:
auto ptr = std::shared_ptr<Foo>(&foo, [](void*){});
此外,在您的方法中,说ptr
拥有foo
是不正确的;相反,它在空的std::shared_ptr<Foo>
中拥有null对象,并且指向foo
(有关更长的讨论,请参阅此答案)。在我上面的代码中,它确实在某种技术意义上"拥有"foo
(或者至少它认为自己拥有);当它的引用计数达到零时,它被阻止对它做任何事情。
- 如何在没有函数的情况下编写此代码并使C++更简单?
- 查找定义我的 C/C++ 函数/宏的文件比'grep'更简单的方法
- 类的方法和对象。参考?智能指针?简单的初始化?
- 将while+if else转为更简单的std::remove_if
- 让类与运算符一起工作更简单的方法
- 多个 if-else 测试的更简单方法
- 为具有多个参数的函数创建 SWIG 类型图的更简单方法?
- 有没有更简单的方法可以从用户那里获取三个数字并按升序打印它们?
- 为什么引用比指针更安全?
- 约束模板参数顺序的更简单方法
- C++ 将整数与硬编码的整数集进行比较的更简单方法
- C/C++ 如何在一次函数调用中交出 const 函数指针或简单指针
- 有没有一种方法可以在基于枚举的可变参数模板函数之间进行选择,这比将函数包装在结构中更简单
- 一种在没有 root 的情况下加载共享库的更简单方法
- 如何通过指针更快地访问变量,然后直接访问变量?
- 是否有一种更简单的方法可以使用GDB将C捕获的C结构捕获
- 非常量指针更喜欢常量 T&重载而不是常量 T*
- 访问派生属性和给定基指针的方法的更简单方法
- 让shared_ptr拥有现有指针的更简单方法
- 处理指向模板中成员的指针,同时创建用于asio的更简单的' bind '