Russian Qt Forum
Ноябрь 28, 2024, 12:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: очистка памяти  (Прочитано 4962 раз)
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;
а как быть во втором??
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Февраль 26, 2010, 19:11 »

В деструкторе B рубить все A. Не?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
crossly
Гость
« Ответ #2 : Февраль 26, 2010, 19:17 »

была такая мысль..... а что если мне после удаления b понадобится попользоваться ещё a?? ведь после delete b a похерится...как быть в таком случае...
Записан
Samuill
Гость
« Ответ #3 : Февраль 26, 2010, 19:30 »

Тогда при delete b вы просто потеряете указатели на добавленные объекты и не сможете к ним обращаться, если, конечно, не позаботитесь об этом вне объекта b
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Февраль 26, 2010, 19:43 »

Вообще b->addA(new A()); //2 лучше не делать.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Rcus
Гость
« Ответ #5 : Февраль 26, 2010, 19:44 »

Странный вопрос... Нужно просто выбрать контракт и следовать ему. Либо владение объектом передается, либо остается у создавшего. Разделение владения и слабые ссылки тоже работают.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Февраль 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, об этом приходится помнить.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.447 секунд. Запросов: 23.