Прав ли деструктор? У моего кода есть утечка памяти?
Возможно. Если предполагается, что X
станет владельцем объектов objectZ
в его массиве, то ему необходимо освободить эти объекты, а затем освободить сам массив, иначе они будут утечки.
Кстати, в вашем примере main()
есть утечка x1
объекта. Непонятно, хотели ли вы звонить delete x1
вместо delete o1
, или x1->add(o1)
должен стать владельцем o1
или нет.
как правильно определить деструктор класса X без утечек памяти
Не занимаясь ручным управлением памятью в первую очередь. Правильно используйте интеллектуальные указатели std::unique_ptr
и std::shared_ptr
и предоставьте им возможность управлять памятью.
учитывая, что он также наследуется от вектора указателей на другой объект Y, нужно ли циклически преобразовывать элемент 1 на 1 и вызывать удаление для него
Вполне вероятно, да. Это действительно зависит от модели собственности, которую использует X
. Если X
становится владельцем объектов objectY
и objectZ
, то он отвечает за их освобождение. В противном случае, если он не вступает во владение, он не несет ответственности за их освобождение.
и clear () в конце или достаточно clear ()?
Для массива необработанных указателей clear()
просто удаляет указатели из массива, но не освобождает объекты, на которые указывают. Массив интеллектуальных указателей, с другой стороны, освободит объекты при удалении интеллектуальных указателей из массива.
Я думаю, что поскольку я не выделяю память из класса X, мне также не нужно ее выделять.
Любой объект, выделенный с помощью new
, должен быть освобожден с помощью delete
. То, должно ли это происходить внутри X
или нет, будет зависеть от конкретной модели владения X
.