Я заметил в ваших комментариях, что у вас есть объект, выделенный в стеке, который вы хотите std::shared_ptr
, чтобы ... если это так, вам придется скопировать ваш объект из стека в кучу, делая что-тонапример:
std::shared_ptr<my_object_t> sh_ptr(new my_object_t(stack_object));
Это затем выделит копию вашего стекового объекта в куче и создаст std::shared_ptr
из этого выделенного в куче объекта.Затем вы можете скопировать только что созданный общий указатель в контейнер и т. Д.
Также я бы согласился с комментариями Немо о том, что ваш класс CurveShift
должен содержать копию shared_ptr
, а не постоянную ссылкуобъекту класса Curve
... таким образом, объект shared_ptr
будет управлять временем жизни ссылки на указатель, и если контейнер или какой-либо другой объект попытается уничтожить память, указанную экземпляром shared_ptr
во времяэто собственная деконструкция, ссылка на память все еще будет сохраняться в экземпляре CurveShift
, так как вызов деструктора shared_ptr
в другом месте фактически не освободит память для объекта в куче, так как ваш объект экземпляра CurveShift
имеет активную ссылкук этой куче выделен объект, удерживаемый shared_ptr
.Удерживая только постоянную ссылку, вы исключаете все преимущества использования типа shared_ptr
, который является управляемой деконструкцией объекта, размещенного в куче, посредством некоторой формы подсчета ссылок.
В конце я напишу вам класс следующим образом:
class CurveShift: public Curve {
public:
CurveShift(const shared_ptr<Curve>& ptr): _curve(ptr)
{
// ... rest of constructor
}
private:
shared_ptr<Curve> curve_; //will remain valid for lifetime of CurveShift instance
// ...
};
А затем вы сделаете вызов вроде:
CurveShift cs(SomeGlobalRepository::Get("key"));
Какие копии в shared_ptr
к вашему CurveShift
экземпляру и увеличивает количество ссылок на указатель на кучу, которой он управляет.