Russian Qt Forum

Программирование => С/C++ => Тема начата: crossly от Февраль 26, 2010, 18:17



Название: очистка памяти
Отправлено: crossly от Февраль 26, 2010, 18:17
все доброго времени суток....

помогите разрулить ситуацию
есть класс А
Код:
class A{
public:
   A();
   ~A();
};
есть класс B
Код:
class B{
   B();
   ~B();
    void addA(A *a);
private
    vector<A*> aVector;
};
main.cpp
Код:
...
A *a=new A();
B *b=new B();
b->addA(a);// 1
b->addA(new A()); //2
...

в первом случае я могу сделать delete a;
а как быть во втором??


Название: Re: очистка памяти
Отправлено: Пантер от Февраль 26, 2010, 19:11
В деструкторе B рубить все A. Не?


Название: Re: очистка памяти
Отправлено: crossly от Февраль 26, 2010, 19:17
была такая мысль..... а что если мне после удаления b понадобится попользоваться ещё a?? ведь после delete b a похерится...как быть в таком случае...


Название: Re: очистка памяти
Отправлено: Samuill от Февраль 26, 2010, 19:30
Тогда при delete b вы просто потеряете указатели на добавленные объекты и не сможете к ним обращаться, если, конечно, не позаботитесь об этом вне объекта b


Название: Re: очистка памяти
Отправлено: Пантер от Февраль 26, 2010, 19:43
Вообще b->addA(new A()); //2 лучше не делать.


Название: Re: очистка памяти
Отправлено: Rcus от Февраль 26, 2010, 19:44
Странный вопрос... Нужно просто выбрать контракт и следовать ему. Либо владение объектом передается, либо остается у создавшего. Разделение владения и слабые ссылки тоже работают.


Название: Re: очистка памяти
Отправлено: Igors от Февраль 26, 2010, 19:48
была такая мысль..... а что если мне после удаления b понадобится попользоваться ещё a?? ведь после delete b a похерится...как быть в таком случае...
Такое бывает, я часто решаю так

Код:
vector <A> mDataVec;
....
vector <A *> ptrVec;
...
ptrVec.clear();
for (int i = 0; i < mDataVec.size(); ++i)
 ptrVec.push_back(&mDataVec[i]);
Теперь я могу безболезненно удалять ptrVec, за хранение отвечает mDataVec. Отрицательная сторона - вектор указателей становится калечным если я меняю число элементов в mDataVec, об этом приходится помнить.