Выделить массив указателей на объекты? - PullRequest
0 голосов
/ 13 ноября 2010

Рассмотрим следующую ситуацию:

Class** array = new Class*[8];
array[1] = new Class(1,2);

Достаточно ли просто "delete[ ] array" или я должен предшествовать первому "delete array[1]". Мне не совсем удобно управлять памятью.

Ответы [ 2 ]

5 голосов
/ 13 ноября 2010

Каждый раз, когда вы звоните new[], вы должны вызывать delete[] на указателе, чтобы освободить. Каждый раз, когда вы звоните new, вы должны звонить delete.

В вашем случае вы звоните new дважды. array[1] содержит указатель на класс, выделенный с new, поэтому он должен быть освобожден с delete. И array - указатель на массив, выделенный с помощью new[], поэтому он должен быть освобожден с помощью delete[].

Конечно, вы могли бы избавить себя от этой головной боли, просто объявив массив следующим образом:

Class array[8];
array[1] = Class(1,2);

отсутствие динамического выделения памяти означает, что нет необходимости вызывать delete.

Или используя std::vector:

std::vector<Class> array(8);
array[1] = Class(1,2);
0 голосов
/ 13 ноября 2010

Если вы создаете vector объектов класса Класса и предполагаете, что sizeof(Class) превышает 4 байта, то vector будет делать копии и тратить память. Вместо этого рассмотрите возможность использования вектора указателей на объекты класса, который всегда будет создавать 4 * 8 = 32 байтов памяти, не относящихся к sizeof(Class).

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