繁体   English   中英

将派生的智能指针指向基本引用返回的堆栈对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM