Определить деструктор класса X, который наследуется от вектора указателей на объект Y и имеет массив указателей на Z - PullRequest
0 голосов
/ 26 июня 2019

Так что я постараюсь быть как можно яснее об этом.Допустим, у нас есть следующее:

class X : protected vector<objectY*> 
{
private:
objectZ** array;
unsigned size;
unsigned capacity;

public:
X():size(0), capacity(0), array(new objectZ*[100]){}
X(const objectX& o); // to be defined later 
X& operator=(const X& x); //defined later
~X(){ delete [] array; clear(); } <--- is this correct, or it produces memory leak?
void add(objectZ* o); // used to add objects to array

} 

Теперь предположим, что мы уже определили классы Y и Z со всеми основными вещами, которые нам нужны для компиляции приведенного выше кода.Мой вопрос заключается в следующем: правильно ли деструктор?У моего кода есть утечка памяти?

Скажем, я иду в main () и делаю это:

objectZ* o1 = new objectZ();
objectX* x1 = new objectX();

x1->add(o1);

 delete o1; // to avoid memory leak;
return 0; // end of main.

Так как я в основном добавляю вещи в массив objectX из main, и, скорее всего,используя полиморфизм, такой как

 objectZ* ok = new objectK(); // where k is derived from Z
 x1->add(ok);

, как правильно определить деструктор класса X без утечек памяти, и учитывая, что он также наследуется от вектора указателей на другой объект Y, нужно ли циклически изменять вектор 1на 1 элемент и вызовите delete на нем, и clear () в конце или достаточно clear ()?Циклировать ли массив и вызывать delete для его элементов?Я думаю, что, поскольку я не выделяю память из класса X, мне также не нужно ее выделять.Мне нужно только удалить массив [] и, возможно, очистить () унаследованный вектор.

1 Ответ

1 голос
/ 26 июня 2019

Прав ли деструктор? У моего кода есть утечка памяти?

Возможно. Если предполагается, что 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...