Нарушение доступа к памяти C ++ при попытке глубокого копирования уникального указателя - PullRequest
0 голосов
/ 22 октября 2018

Таким образом, у меня есть следующий класс как таковой:

class foo{
public:
  unique_ptr<someClass> pt;
Foo(){}
//Copy constructor
Foo(Foo& f){
  someClass * copy = f.pt.get();
  pt=unique_ptr<someClass>(copy);
}

};

Таким образом, приведенный выше код работает как задумано, конструктор копирования сделает текущий класс точной копией данного класса.Но это также дает мне нарушение доступа к памяти.Я попытался отладить его в valgrind, но он говорит, что он как-то связан с удалением по умолчанию в классе unique_ptr.Тем не менее, ни в одной точке моего кода я не вызываю delete.

Мне было интересно, есть ли способ устранить эти нарушения доступа к памяти или есть еще один шаг, который мне не хватает в этом.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Для глубокого копирования вам придется изменить конструктор копирования следующим образом:

Foo(Foo& f) : pt( new someClass( *f.pt.get() ) ) {}

И вам также нужно будет определить конструктор копирования для someClass, если он еще не определен.

0 голосов
/ 22 октября 2018

Это не глубокая копия, это, в лучшем случае, мелкая копия, вы извлекаете указатель из умного указателя и ставите его вторым.

Это не удастся.Вы должны сначала клонировать объект.

...