【发布时间】:2020-08-12 07:05:32
【问题描述】:
http://www.cplusplus.com/reference/memory/shared_ptr/ 说
不拥有任何指针的 shared_ptr 称为空 shared_ptr。不指向任何对象的 shared_ptr 称为 null shared_ptr 并且不应被取消引用。请注意,虽然空的 shared_ptr 不一定是空的 shared_ptr,空的 shared_ptr 也不一定是空的 shared_ptr。
我是否能够创建一个空的 std::shared_ptr,即一个不拥有任何东西但不为空(即包含有效负载)的 std::shared_ptr?
用例是将“遗留”代码与现代指针结合起来:鉴于 foo 的调用语法不会更改,
void foo(const MyClass* p) {
if (p == nullptr) {
auto defaultObject = std::make_shared<MyClass>("some", "parameters");
defaultObject->doSomething();
...
defaultObject->doSomethingElse();
// The default object must be destroyed again
} else {
p->doSomething();
...
p->doSomethingElse();
// p must not be destroyed, its memory is managed somewhere else
}
}
是否有 doNotOwnButStillPointTo() 的实现允许这样做:
void foo(const MyClass* p) {
std::shared_ptr<MyClass> wrapper;
if (p == nullptr) {
// Create a default object
wrapper = std::make_shared<MyClass>("some", "parameters");
} else {
wrapper = doNotOwnButStillPointTo(p);
}
wrapper->doSomething();
...
wrapper->doSomethingElse();
// p mus not be destroyed, the default object (if created) shall be
}
或者,为了不爱上XY-Problem,是否有不同的智能指针可用或根本没有?
- 但是,我想补充一点,
std::make_shared<MyClass>("some", "parameters")行实际上是对创建 shared_ptr 的更复杂函数的调用。我想保留这个函数并使用它的结果
【问题讨论】:
-
cplusplus.com是一个低质量的 C++ 网站。cppreference.com好多了。 std::shared_ptr 可以是 empty shared_ptr 可能有一个非空的存储指向,如果使用别名构造函数来创建它。比如来自一个沮丧的人。 -
@PhilLab: '"用例是将“遗留”代码与现代指针结合起来" 为什么不在这里使用
unique_ptr?在这种情况下,您的shared_ptr永远不会离开您的范围,因此无需共享其所有权语义。
标签: c++ c++11 visual-c++ c++17 smart-pointers