вектор указателя на объект - как избежать утечки памяти? - PullRequest
0 голосов
/ 10 августа 2010

Как мы обычно имеем дело с вектором, элементы которого являются указателями на объект?Мой конкретный вопрос - это комментарий в конце кода ниже.Спасибо.

class A
{
 public:
 virtual int play() = 0 ; 
};

class B : public A 
{
public:
 int play() {cout << "play in B " << endl;};

};

class C : public A 
{
public:
 int play() {cout << "play in C " << endl;};

};


int main()
{

    vector<A *> l;
    l.push_back(new B());
    l.push_back(new C());

    for(int i = 0 ; i < l.size();i++)
    {
            l[i]->play();
    }

    //Do i have to do this to avoid memory leak? It is akward. Any better way to do this? 
    for(int i = 0 ; i < l.size();i++)
    {
            delete l[i];
    }

  }

Ответы [ 3 ]

7 голосов
/ 10 августа 2010

Да, вы должны сделать это, чтобы избежать утечки памяти. Лучший способ сделать это - создать вектор общих указателей ( boost , C ++ TR1, C ++ 0x,)

 std::vector<std::tr1::shared_ptr<A> > l;

или вектор уникальных указателей (C ++ 0x), если объекты на самом деле не совместно используются между этим контейнером и чем-то еще

 std::vector<std::unique_ptr<A>> l;

или использовать буст контейнеры-указатели

  boost::ptr_vector<A> l;

PS: Не забывайте, виртуальный деструктор А, согласно @Neil Butterworth!

5 голосов
/ 10 августа 2010

Использовать массив shared_ptr или аналогичный умный указатель. И обратите внимание, что ваш базовый класс должен иметь виртуальный деструктор, чтобы этот код работал правильно.

0 голосов
/ 10 августа 2010

Лучшим способом было бы использовать умные указатели ( Boost shared_ptr ), чтобы избежать подобных вещей.Но если вам НУЖНО иметь сырые указатели, я считаю, что это способ сделать это.

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