Я уверен, что это очень просто, но я довольно новичок в интеллектуальных указателях, и я не смог найти ответ на этот вопрос.
Сценарий очень прост: у меня есть класс А,который содержит shared_ptr для некоторого объекта X:
class A{
shared_ptr<const X> _asX;
}
, теперь после серии вызовов функций я создаю новый объект типа B, который также содержит этот X. что-то вроде:
class B {
private:
shared_ptr<const X> _bsX;
public:
B(): _bsX(nullptr) // - maybe this is problematic {}
foo(shared_ptr<const X>& x)
{
_bsX = x;
// The line above gives me undefined behavior,
// and when I run valgrind I get "Conditional jump or move
// depends on uninitialized value(s)",
// telling me this is not the correct way to do things.
}
Обратите внимание, что намеренно foo действительно устанавливает значение _bsX, а не конструктор.
Так, как указано выше - в зависимости от компилятора, я получаю ошибки сегментации - что обычно означает, что какое-то значение не было инициализировано, а позже подтверждено valgrind.
Итак, что мне делать - я пытался использовать «сброс» и т. Д., Но я так растерялся, что прошу вашей помощи.Может ли это быть const?или передать по ссылке?или оператор '='.
И в то время как мы находимся на этом - я должен передать X с его оберткой (shared_ptr) в foo, или я должен передать необработанный указатель, а затем сделать его общим?если так - не могли бы вы привести пример.Я тоже это попробовал и получил ошибки.