[英]Pointing a derived smart pointer to a stack object returned by base reference
我有个问题。 我想将shared_ptrs指向存储在类中的对象。 在代码中,有一个Holder :: getSomething()函数,该函数返回对基的引用。 我想将其转换为派生的b_ptr。 这是代码:
#include <memory>
using namespace std;
class A{
public:
int a;
A() : a(0){}
virtual ~A(){}
};
class B : public A {
public:
bool b;
B() : A(){ b = false; }
};
class Holder{
public:
B arr[1];
// there's an A ref here, not B, because i'll have a boatload of deriveds.
A& getSomething(){
return arr[0];
}
Holder(){
arr[0] = B();
}
};
int main(){
Holder h;
shared_ptr<B> b_ptr;
// b_ptr = something_alien_here(h.getSomething());
return 0;
};
我知道(并且“知道”,我的意思是没有根据的猜测)我应该使用dynamic_(pointer _?)cast,但是我找不到/弄清楚正确的语法。
如果可以保证h
寿命比b_ptr
更长,则可以将shared_ptr
的借用构造函数与b_ptr
一起使用:
Holder h;
std::shared_ptr<B> b_ptr(std::shared_ptr<B>(),
&static_cast<B&>(h.getSomething()));
现在, b_ptr
与临时的空共享指针共享所有权,这具有从不调用B
的删除器的作用。 这就是为什么现在您有责任保证指针至少存在,只要可以取消引用共享指针。
共享指针的全部要点是它的ref被计数并破坏
当最后一个超出范围时,它指向什么。 你不希望那样发生
到另一个类的成员对象,因为这是未定义的行为。
简而言之; 不要那样做
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.