Повторный вызов конструктора копирования для той же переменной-указателя утечка памяти? - PullRequest
0 голосов
/ 04 октября 2011

У меня небольшой вопрос:

Foo *myFoo;
myFoo = new Foo(anotherFoo);     // some deep copy of another object
myFoo = new Foo(yetAnotherFoo);  // another deep copy of yet another object

Это утечка памяти и, если да, как я могу ее избежать?Ситуация в моей программе такова, что «myFoo» является членом класса, и я хочу использовать его как «один-единственный» объект хранения для глубокой копии некоторого другого объекта время от времени (потому что скопированный объект изменяетсяпотом и мне нужен начальный объект для последующего сравнения).

Я пробовал простой обходной путь, например:

// within a class method of the same class
if (myFoo!=NULL) delete myFoo;
myFoo = new Foo(fooToStore);

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

Большое спасибо за ваше время и помощь - цените это!Mark

Ответы [ 3 ]

4 голосов
/ 04 октября 2011

Не удаляя результат выражения new перед повторным назначением указателя, несомненно, происходит утечка памяти.Явное решение delete должно работать, но на самом деле вам нужен член с умным указателем, например scoped_ptr<Foo>.

, который может (или не может) волшебным образом решитьВаша проблема с деструктором.

2 голосов
/ 04 октября 2011

Да, это утечка памяти, потому что второе присваивание myFoo делает первый выделенный Foo недоступным. Удаление myFoo между последовательными распределениями - правильная вещь. Обратите внимание, что вам не нужно проверять нулевой указатель: delete позаботится об этом. Скорее всего, у вас есть проблема с деструктором Foo.

0 голосов
/ 04 октября 2011

Я предполагаю, что «но это приводит к сбою моей программы, как только деструктор вызывается», означает, что деструктор основного класса вызывает «myFoo» delete.

Не забудьте инициализировать «myFoo» в null в mainконструктор класса, это предотвратит сбои в деструкторе основного класса, если не созданы экземпляры myFoo.

...