是否可以让一个静态对象和一个静态 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);
}
给出以下 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);
}