Удаление массива указателей - правильно ли я делаю? - PullRequest
2 голосов
/ 24 марта 2011

Я чувствую себя немного глупо из-за того, что задаю вопрос об удалении указателей, но мне нужно убедиться, что я удаляю правильно, так как в данный момент я прохожу процесс отладки моей программы.

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

AsteroidView *_asteroidView[16];

В цикле for я затем инициализирую их:

for(int i = 0; i < 16; i++)  
{  
      _asteroidView[i] = new AsteroidView();  
} 

Хорошо, пока чтотак хорошо, все работает отлично.Когда мне в конечном итоге нужно удалить их в деструкторе, я использую этот код:

for(int i = 0; i < 16; i++)  
{  
        delete _asteroidView[i];  
}

Это все, что мне нужно сделать?Я чувствую, что это так, но меня беспокоит утечка памяти.

Из интереса ... Много ли различий между массивом точек к объектам и массивом объектов?

Ответы [ 4 ]

9 голосов
/ 24 марта 2011

Это правильно.Однако вы можете рассмотреть возможность использования Boost.PointerContainer и избавить вас от хлопот, связанных с ручным управлением ресурсами:

boost::ptr_vector<AsteroidView> _asteroidView;
for(int i = 0; i < 16; i++)
{
    _asteroidView.push_back(new AsteroidView());
}

Вам не нужно управлять удалением, контейнер делаетэто для тебя.Эта техника называется RAII , и вы должны узнать о ней, если хотите повеселиться, используя C ++:)

О редактировании: Есть несколько отличий, ноЯ думаю, наиболее важными из них являются:

  1. Массив указателей может содержать объекты разных типов, если это подклассы типа массива.
  2. Массив объектов не требуетсяпри любом удалении все объекты уничтожаются при уничтожении массива.
7 голосов
/ 24 марта 2011

Это абсолютно нормально.

Эмпирическое правило : соответствует каждому вызову new с соответствующим вызовом delete (и каждый вызов new[] с звонком на delete[])

5 голосов
/ 24 марта 2011

Это все, что мне нужно сделать?Я чувствую, что это так, но меня беспокоит утечка памяти.

Да.Программа правильно распределяет ресурсы.Нет утечек памяти:)


Если вам удобно использовать std::vector (на самом деле это легко), он выполняет процесс освобождения, когда выходит за рамки.Тем не менее, тип должен быть -

std::vector<AsteroidView>
1 голос
/ 24 марта 2011

Учитывая класс:

// this class has hidden data and no methods other than the constructor/destructor
// obviously it's not ready for prime time
class Foo {
    int* bar_[16];

    public:
    Foo()
    {
        for (unsigned int i = 0; i < 16; ++i)
            bar_[i] = new int;
    }

    ~Foo()
    {
        for (unsigned int i= 0; i < 16; ++i)
            delete bar_[i];
    }
};

Вы не потеряете память , если конструктор завершит работу правильно . Однако, если new терпит неудачу, терпит неудачу в конструкторе (new выбрасывает std::bad_alloc, если у вас недостаточно памяти), , тогда деструктор не запускается , и вы будет иметь утечку памяти. Если это вас беспокоит, вы должны будете сделать исключение конструктора безопасным (скажем, добавить блок try ... catch вокруг конструктора, используйте RAII). Лично я бы просто использовал Boost Pointer Container, если элементы в массиве должны быть указателями, и std::vector, если нет.

...