gpt4 book ai didi

c++ - 在 C++11 中使用不带托管共享指针的 shared_from_this()

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:18 25 4
gpt4 key购买 nike

假设我有一个类是 enable_shared_from_this 的子类。这个基类的文档说在调用 shared_from_this 之前应该有一个拥有这个类的共享指针。使用new分配类并调用shared_from_this来管理对象是否安全?

最佳答案

正如其他用户已经提到的,在不属于 shared_ptr 的实例上调用 shared_from_this 将导致未定义的行为(通常是异常,但也有没有保证)。

那么,为什么还要一个答案呢?

因为我自己做了一次同样的问题并得到了几乎相同的答案,然后我开始为另一个问题而苦苦挣扎,这个问题紧随其后 - 我如何保证所有实例都由 管理shared_ptr?

为了完整起见,我添加了另一个答案,其中包含有关这方面的一些细节。
这里有一个以前没有提到的简单解决方案。

确实是一个如此简单的解决方案:私有(private)构造函数工厂方法可变参数模板
它遵循一个片段,在一个最小的例子中将所有这些混合在一起:

#include<memory>
#include<utility>

class C: public std::enable_shared_from_this<C> {
C() = default;
C(const C &) = default;
C(C &&) = default;
C& operator=(const C &) = default;
C& operator=(C &&c) = default;

public:
template<typename... Args>
static std::shared_ptr<C> create(Args&&... args) noexcept {
return std::shared_ptr<C>{new C{std::forward<Args>(args)...}};
}

std::shared_ptr<C> ptr() noexcept {
return shared_from_this();
}
};

int main() {
std::shared_ptr<C> c1 = C::create();
std::shared_ptr<C> c2 = C::create(*c1);
std::shared_ptr<C> c3 = c2->ptr();
// these won't work anymore...
// C c4{};
// std::shared_ptr<C> c5 = std::make_shared<C>();
// std::shared_ptr<C> c6{new C{}};
// C c7{*c1};
// ... and so on ...
}

基本(微不足道?)的想法是禁止显式构造新实例,而是通过使用此处称为 create 的工厂方法。
可变参数模板用于避免编写多个工厂方法,仅此而已。完美转发帮助我们以正确的方式做到这一点。

很简单,不是吗?
无论如何,我花了一段时间才弄清楚这一点,所以我希望这能帮助 future 的读者解决同样的问题。

关于c++ - 在 C++11 中使用不带托管共享指针的 shared_from_this(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34213087/

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