gpt4 book ai didi

c++ - std::shared_ptr 为空但不为 null

转载 作者:行者123 更新时间:2023-12-02 07:06:47 28 4
gpt4 key购买 nike

http://www.cplusplus.com/reference/memory/shared_ptr/

A shared_ptr that does not own any pointer is called an empty shared_ptr. A shared_ptr that points to no object is called a null shared_ptr and shall not be dereferenced. Notice though that an empty shared_ptr is not necessarily a null shared_ptr, and a null shared_ptr is not necessarily an empty shared_ptr.

我是否能够创建一个空的 std::shared_ptr,即不拥有任何东西但不为 null 的对象,即包含有效负载?

用例是将“遗留”代码与现代指针结合起来:鉴于 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。我想保留这个函数并使用它的结果

最佳答案

shared_ptr 有一个删除器。这是销毁底层对象的多态过程。您可能有一个空的删除器:

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 = std::shared_ptr<MyClass>(p, [](MyClass*){});
}

wrapper->doSomething();
...
wrapper->doSomethingElse();
// p mus not be destroyed, the default object (if created) shall be
}

但这会导致糟糕的设计。回到问题XY:目的是什么?有人可能会向您传递一个对象作为原始指针(但可能会传递 nullptr)。您希望创建一个本地对象,以防提供 nullptr 而不是真实对象。您可能希望防止内存泄漏。好的。

void foo(const MyClass* p) {
std::shared_ptr<MyClass> local;
if (p == nullptr) {
// Create a default object
local = std::make_shared<MyClass>("some", "parameters");
p = local.get();
}

// p is always valid, local will always be destroyed (if exists)
p->doSomething();
...
p->doSomethingElse();
}

关于c++ - std::shared_ptr 为空但不为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61480691/

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