Указание полученного интеллектуального указателя на объект стека, возвращаемый базовой ссылкой

У меня проблема. Я хотел бы указать 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 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;
};
</b></memory>

Я знаю (и "знаю", я имею в виду, что у меня есть необразованная догадка), что я должен использовать casting dynamic_ (pointer _?), Но я не могу найти/выяснить правильный синтаксис.

2 ответа

Вся точка общего указателя состоит в том, что его ref подсчитывает и разрушает на что указывает, когда последний выходит из сферы действия. Вы не хотите, чтобы это произошло к объекту-члену другого класса, поскольку это неопределенное поведение.

вкратце; не делайте этого.


Если вы можете гарантировать, что h будет жить дольше b_ptr, тогда вы можете использовать конструктор заимствований shared_ptr вместе с литой:

Holder h;

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

Теперь b_ptr долей владением с помощью временного пустого общего указателя, что приводит к тому, что он никогда не вызывает дебетер для B Вот почему теперь вы несете ответственность за гарантию того, что указатель существует, по крайней мере, до тех пор, пока общий указатель может быть разыменован.

licensed under cc by-sa 3.0 with attribution.