gpt4 book ai didi

c++ - 调用删除器时 shared_ptr 是否仍然拥有它的对象?

转载 作者:可可西里 更新时间:2023-11-01 15:53:09 26 4
gpt4 key购买 nike

我有一个带有自定义删除器的 std::shared_ptr,在那个删除器中,我想获取原始 std::shared_ptr 的临时拷贝。用代码形式表示:

struct Foo : public std::enable_shared_from_this<Foo>
{};

void deleter(Foo *f)
{
{
std::shared_ptr<Foo> tmp = f->shared_from_this(); // Line A
}
delete f;
}

int main()
{
std::shared_ptr<Foo> foo(new Foo, &deleter);
}

我的问题是:在 A 行,关于 shared_from_this() 的调用有什么可以说的吗?合法吗?如果是这样,标准是否说明了它的返回值?如果我们将 enable_shared_from_this 替换为不同的 weak_ptr 或对 foo 的全局引用,答案是否相同?

Clang使用 libc++ 和 gcc使用 libstdc++ 时,两者都会生成终止于 bad_weak_ptr 异常的代码,但我似乎无法将此作为标准要求 进行跟踪。这是特定于实现的,还是我遗漏了一条规则?

我找到的所有相关规则(引用 C++11):

20.7.2.2.2 shared_ptr destructor

1 ... if *this owns an object p and a deleter d, d(p) is called
2 [Note: ... Since the destruction of *this decreases the number of instances that share ownership with *this by one, after *this has been destroyed all shared_ptr instances that shared ownership with *this will report a use_count() that is one less than its previous value. —end note]

20.7.2.2.5 shared_ptr observers

7 use_count Returns: the number of shared_ptr objects, *this included, that share ownership with *this, or 0 when *this is empty.

对我来说,似乎不清楚 use_count 的递减发生在删除器调用之前还是之后。 bad_weak_ptr 是一个可靠的结果,还是只是未指定?

请注意,我有意避免在我的示例代码中像 tmp 这样的指针会比删除器执行时间更长的情况。

最佳答案

考虑

[c++14-12.4-15]Once a destructor is invoked for an object, the object no longer exists;

[c++14-20.8.2.4-7]shared_from_this()[...]Requires: enable_shared_from_this shall be an accessible base class of T. *this shall be a subobject of an object t of type T. There shall be at least one shared_ptr instance p that owns &t.

因此,考虑到删除器是由 shared_ptr 析构函数调用的,在最后一个拥有它的 shared_ptr 的删除器中调用 shared_from_this() 会导致未定义的行为。

编辑:正如 YSC 所指出的,在 C++17 中,shared_from_this() 需要表现为相应的 weak_ptr 转换调用。这使事情变得复杂,因为不清楚 weak_ptr::expired() 应该在 deleter 调用时返回什么......无论如何,从字面上看引用的 20.7.2.2.2 注意,一个 bad_weak_ptr 应该在这种情况。

关于c++ - 调用删除器时 shared_ptr 是否仍然拥有它的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46647004/

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