Когда мы определяем конструктор копирования, требуется ли очищать содержимое объекта, который мы пишем? Я реализую двоичное дерево поиска и задаюсь вопросом, не будет ли утечка памяти, если я не очищу ее при реализации конструктора копирования и оператора присваивания.Конструктор копии C++ с указателями
ответ
Когда мы определяем конструктор копирования, требуется ли очищать содержимое объекта, который мы пишем?
В момент постройки нет содержимого, которое необходимо переписать. Просто убедитесь, что вы делаете все копии переменных-членов в списке инициализаторов-членов конструктора, а не в теле конструктора.
В противном случае компилятор будет генерировать инициализацию по умолчанию для членов, а затем может быть что-то выделенное, которое должно быть очищено и перезаписано (или с глубоким копированием).
Особенно, если вы имеете дело с указателями как вы требуете.
Лучше всего следовать за The Rule of Three (Five), чтобы все было сделано последовательно.
Упреждение за то, что он действительно понимает, казалось бы, бессмысленный вопрос, внося участников в картину. – SergeyA
@SergeyA: Я постараюсь не взять это лично. –
@LightnessRacesinOrbit, как вы попали в картину? И что случилось с красным вопросом о сельди, с которым я собирался обратиться? – SergeyA
Если работает конструктор копирования, нет «объекта, который мы пишем поверх». Вы создаете («строите») новый объект с нуля, но копируете данные из какого-либо другого объекта, чтобы заполнить его начальное состояние.
Для оператора присваивания, да, это определенно является соображением, и вы должны быть уверены, чтобы избежать утечек. Хотя, если вы используете RAII, поэтому у вас нет ручного управления памятью, вам не о чем беспокоиться. (Помимо этого, я не понимаю, как в него вставляются указатели.)
Как указывали другие, использование конструктора копирования создаст новый объект.
Что вы должны учитывать, tho:
Если ваш первоначальный объект является владельцем некоторых других данных, например. foo*
выделено new
или shared_ptr
, копирование объекта будет просто скопировать указатель и его адрес.
Фактически вы не будете копировать принадлежащие ему данные.
В случае необработанного foo*
и delete foo
в вашем деструкторе, второй уничтожаемый объект попытается удалить удаленную память.
- 1. Конструктор копии C++ с указателями
- 2. C++ копии объектов с абстрактными указателями класса
- 3. Копировальный конструктор с указателями
- 4. конструктор копирования с указателями на собственный класс
- 5. Конструктор копии на C++ и мелкая копия
- 6. Конструктор виртуальной копии C++ 11
- 7. Конструктор массивов с указателями функций?
- 8. конструктор копии + назначение оператора
- 9. Почему конструктор копии C++ не работает?
- 10. Конструктор копии C++, который называется несколько раз
- 11. В каких ситуациях называется конструктор копии C++?
- 12. Конструктор копии C++ принимает неправильные значения
- 13. Является ли шаблонный конструктор переопределять неявный конструктор копии в C++?
- 14. C++ - конструктор копирования с указателями, как поле данных
- 15. Конструктор неконтактной копии
- 16. C/C++ - Целые числа, столкнувшиеся с указателями
- 17. , запрещающий конструктор копии с новым стандартом C++ 11
- 18. C# dllimport с указателями
- 19. C проблемы с указателями
- 20. Проблема с указателями C
- 21. C++ арифметика с указателями
- 22. Проблемы с C-указателями
- 23. Помощь с C указателями
- 24. C - Проблема с указателями
- 25. Проблемы с C указателями
- 26. Петля с указателями C
- 27. Проблемы с указателями - C
- 28. сопз корректность с константными объектами и указателями членов, конструктор уязвимость
- 29. путаница, когда конструктор копии внедренного объекта вызывается
- 30. C++ Должен ли я перезаписывать конструктор копии в производном классе
Очистить что? Он еще не построен, нет ничего, что можно было бы очистить. – CoryKramer
Непонятно, что вы просите. Просто убедитесь, что любое выделение сопряжено с одним только освобождением (new/delete, new []/delete [], malloc/free, ...) –
Если вы определяете конструктор копирования, тогда нет ничего, что можно было бы очистить по мере создания из царапина. –