C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Удаление динамического объекта
Vasily
Отправлено: 20.02.2005, 22:35


Дежурный стрелочник

Группа: Участник
Сообщений: 31



Доброго всем времени суток.
Нужен совет.

Есть такой код:
CODE

class Num
{
int I; char* Ch;

public:
Num(/* тут код */);
~Num(){delete[] Ch};
};


vector<Num> V;
for(unsigned f=0; f<10; f++)
{
Num* tmp = new Num;
V.push_back(*tmp);
}
//работа с вектором

Вопрос такой: как правильно очистить вектор — так:
CODE

V.clear();

или так:
CODE

for(unsigned f=0; f<V.size(); f++) delete V[f];
V.clear();

или так
CODE

for(unsigned f=0; f<V.size(); f++) V[f].~Num();
V.clear();

Не произойдет ли в первом случае потери памяти? Или вектор сам вызывает деструктор для каждого элемента?

Отредактировано Vasily — 20/02/2005, 22:44
R@kot
Отправлено: 21.02.2005, 04:25


Дежурный стрелочник

Группа: Участник
Сообщений: 32



При очистке вектор автоматически вызывает деструктор для каждого своего элемента, поэтому достаточно будет просто написать
CODE

V.clear();
xTrim
Отправлено: 21.02.2005, 06:11


Машинист паровоза

Группа: Участник
Сообщений: 208



Да, при удалениии V.clear() утечки не будет. Зато она будет при создании:
CODE

for(unsigned f=0; f<10; f++)
{
Num* tmp = new Num;
V.push_back(*tmp);     \\ тут значение *tmp [B]копируется[/B] в вектор
\\ потеряли память
\\ delete tmp; \\ не потеряли
}

\\ может написать
for(unsigned f=0; f<10; f++)
{
Num tmp;
V.push_back(tmp);
\\ все нормально, локальная переменная удаляется при выходе из блока
}

olegenty
Отправлено: 21.02.2005, 07:52


Ветеран

Группа: Модератор
Сообщений: 2412



ну можно ещё аллокатор сменить, насколько я помню...
Vasily
Отправлено: 24.02.2005, 12:32


Дежурный стрелочник

Группа: Участник
Сообщений: 31



Есть еще один вопрос:
CODE

vector<TCheckBox>V;
for(unsigned f=0; f<10; f++)
{
  TCheckBox* tmp = new TheckBox;
  /......../
  v.push_back(*tmp);
}
/............/
V.clear();

При V.clear() вектор очищается, но объекты с формы не удаляются, почему не вызывается деструктор?
Приходится делать так
CODE

for(unsigned f=0; f<10; f++)delete V[f];
V.clear();

xTrim
Отправлено: 24.02.2005, 13:06


Машинист паровоза

Группа: Участник
Сообщений: 208



Что-то приведенный код вообще работать не будет, имхо.
так работает
CODE

vector<TCheckBox*>V;
for(unsigned f=0; f<10; f++)
{
TCheckBox* tmp = new TCheckBox(this);
V.push_back(tmp); // запихнули указатель
}
for(unsigned f=0; f<10; f++)delete V[f];
V.clear();


или так
CODE

vector<TCheckBox>V;
for(unsigned f=0; f<10; f++)
{
TCheckBox tmp(this);
V.push_back(tmp); // запихнули копию
}
V.clear();

Vasily
Отправлено: 24.02.2005, 23:03


Дежурный стрелочник

Группа: Участник
Сообщений: 31



Прошу прощения, опечатки от моей невниметельности. Я хотел выяснить вопрос с динамическими объектами, потому что изначально не известно сколько их будет.
xTrim
Отправлено: 25.02.2005, 05:41


Машинист паровоза

Группа: Участник
Сообщений: 208



Я кстати насчет второго куска кода прогнал. Конечно так тоже не будет работать, т.к. VCL-objects надо только динамически создавать wink.gif

Вернуться в Вопросы программирования в C++Builder