Деструктор класса с массивом указателей C ++ - PullRequest
4 голосов
/ 20 января 2011

Если у меня есть класс с массивом указателей на другой класс Vehicle :

class List {
    public:
        //stuff goes here
    private:
        Vehicle ** vehicles;
}

Если я сейчас напишу деструктор класса List, буду ли я выполнять итерации вручнуюпо массиву (я знаю, сколько элементов в массиве) и delete каждый указатель на транспортное средство, или C ++ автоматически вызовет деструкторы всех транспортных средств в массиве?

(как это происходит, еслив классе есть частная строка / ... или если это будет контейнер STL с указателями Vehicle)

РЕДАКТИРОВАТЬ: я забыл о delete [] vehicles, но если бы я это сделал, он также удалил быпамять, используемая всеми транспортными средствами в массиве, или она просто удалит память, используемую указателями?

Ответы [ 4 ]

7 голосов
/ 20 января 2011

Вы должны удалить все записи в массиве И удалить массив. В C ++ (STL) есть методы, позволяющие избежать этого: используйте вектор, поэтому вам не нужно удалять массив. Используйте scoped_ptr / shared_ptr для каждого транспортного средства, поэтому вам не нужно удалять транспортные средства.

3 голосов
/ 20 января 2011

Если список владеет объектами Vehicle (создает их в конструкторе), вам необходимо удалить каждый из них, а затем удалить сам массив указателей.

2 голосов
/ 20 января 2011

Если у меня есть класс с массивом указателей на другой класс. Автомобиль:

Vehicle ** vehicles;

vehicles - это не массив указателей, а егоуказатель на указатель на тип Vehicle.Массив указателей будет определен примерно так: Vehicle* vehicles[N].

делать ли я вручную перебирать массив (я знаю, сколько элементов в массиве) и удалять каждый указатель на транспортное средство

Да!Вы не хотите, чтобы ваш код пропускал память?

Я бы порекомендовал использовать Boost::scoped_ptr из библиотеки Boost.Более того, если ваш компилятор поддерживает C ++ 0x, вы также можете использовать std::unique_ptr

0 голосов
/ 20 января 2011

Вы должны вручную выполнить итерации по транспортным средствам и delete каждому из них.

...