2016-01-04 5 views
0

Когда мы определяем конструктор копирования, требуется ли очищать содержимое объекта, который мы пишем? Я реализую двоичное дерево поиска и задаюсь вопросом, не будет ли утечка памяти, если я не очищу ее при реализации конструктора копирования и оператора присваивания.Конструктор копии C++ с указателями

+3

Очистить что? Он еще не построен, нет ничего, что можно было бы очистить. – CoryKramer

+1

Непонятно, что вы просите. Просто убедитесь, что любое выделение сопряжено с одним только освобождением (new/delete, new []/delete [], malloc/free, ...) –

+0

Если вы определяете конструктор копирования, тогда нет ничего, что можно было бы очистить по мере создания из царапина. –

ответ

6

Когда мы определяем конструктор копирования, требуется ли очищать содержимое объекта, который мы пишем?

В момент постройки нет содержимого, которое необходимо переписать. Просто убедитесь, что вы делаете все копии переменных-членов в списке инициализаторов-членов конструктора, а не в теле конструктора.

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

Особенно, если вы имеете дело с указателями как вы требуете.

Лучше всего следовать за The Rule of Three (Five), чтобы все было сделано последовательно.

+0

Упреждение за то, что он действительно понимает, казалось бы, бессмысленный вопрос, внося участников в картину. – SergeyA

+0

@SergeyA: Я постараюсь не взять это лично. –

+1

@LightnessRacesinOrbit, как вы попали в картину? И что случилось с красным вопросом о сельди, с которым я собирался обратиться? – SergeyA

4

Если работает конструктор копирования, нет «объекта, который мы пишем поверх». Вы создаете («строите») новый объект с нуля, но копируете данные из какого-либо другого объекта, чтобы заполнить его начальное состояние.

Для оператора присваивания, да, это определенно является соображением, и вы должны быть уверены, чтобы избежать утечек. Хотя, если вы используете RAII, поэтому у вас нет ручного управления памятью, вам не о чем беспокоиться. (Помимо этого, я не понимаю, как в него вставляются указатели.)

1

Как указывали другие, использование конструктора копирования создаст новый объект.
Что вы должны учитывать, tho:
Если ваш первоначальный объект является владельцем некоторых других данных, например. foo* выделено new или shared_ptr, копирование объекта будет просто скопировать указатель и его адрес.
Фактически вы не будете копировать принадлежащие ему данные.
В случае необработанного foo* и delete foo в вашем деструкторе, второй уничтожаемый объект попытается удалить удаленную память.

Смежные вопросы