是否可以让一个静态对象和一个静态 std::shared_ptr 指向同一个对象?

Is it possible to have a static object and a static std::shared_ptr pointing to the same object?

给出以下 class:

class Foo : public Base {
public:
  static const Foo FOO;
  static const std::shared_ptr<Foo> FOO_PTR;
  // .. virtual methods, etc
};

是否可以让FOO_PTR指向FOO

这似乎很难,因为创建共享指针的通常方法是获取动态创建的指针的所有权(例如,通过 new Foo{})或通过 std::make_shared<Foo>(),两者都创建一个新对象并且不允许您将 shared_ptr 指向 FOO。同样,如果我先创建指针,它将具有与 FOO 不同的身份,所以我想我也被搞砸了。

真正肮脏的黑客可能是这样的:

Foo Foo::FOO = Foo{};
std::shared_ptr<Foo> Foo::FOO_PTR = &Foo::FOO;  // dirty hack
Foo* dummy = new shared_ptr<Foo>(FOO_PTR);      // leaky, yuck

基本上我们首先创建静态 FOO 对象,然后使用指向该对象的指针初始化 shared_ptr<FOO>。现在当然这个对象不是通过 new 创建的,所以如果 shared_ptr 试图删除它,世界可能会结束。为了解决这个问题,我们做的最后一件事是从第一个创建另一个 shared_ptr,增加它的引用计数,然后泄漏它,所以原来的 shared_ptr 永远不会尝试删除它的指针。

当然,这让我感到恶心,我正在寻找更好的解决方案。

现在 显而易见的 解决方案不会首先公开 FOO and/or FOO_PTR 静态对象,但我的手被束缚了在这里,我无法更改那部分设计。

不确定它是否可以帮助您解决 API 限制,但您可以通过动态创建 shared_ptr-object 并让 foo 类型为 [=12] 来扭转局面=] 然后:

class Foo {
public:
    static const Foo &FOO;
    static const std::shared_ptr<Foo> FOOPTR;
};

const std::shared_ptr<Foo> Foo::FOOPTR = make_shared<Foo>();
const Foo &Foo::FOO = *Foo::FOOPTR;

int main() {
    const Foo* f1 = Foo::FOOPTR.get();
    const Foo* f2 = &Foo::FOO;

    printf("%p == %p \n",(void*)f1,(void*)f2);
}