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 |
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
|
При очистке вектор автоматически вызывает деструктор для каждого своего элемента, поэтому достаточно будет просто написать
|
|
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 надо только динамически создавать
|
|