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

时间:2014-07-31 20:25:13

标签: c++ shared-ptr

我有问题。我想将shared_ptrs指向存储在类中的对象。在代码中有一个Holder :: getSomething()函数,它返回对base的引用。我想把它转换为派生的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_(指针_?)演员,但我无法找到/找出正确的语法。

2 个答案:

答案 0 :(得分:0)

如果您可以保证h的有效期超过b_ptr,那么您可以使用shared_ptr的借用构造函数以及演员:

Holder h;

std::shared_ptr<B> b_ptr(std::shared_ptr<B>(),
                         &static_cast<B&>(h.getSomething()));

现在b_ptr与临时的空共享指针共享所有权,该指针具有从不调用B的删除器的效果。这就是为什么现在你的责任保证指针对象存在至少只要共享指针可以被解引用。

答案 1 :(得分:0)

共享指针的重点是它的引用计数,并且破坏了 当最后一个超出范围时它指向什么。你不希望发生这种情况 到另一个类的成员对象,因为这是未定义的行为。

简而言之;不要这样做。