Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>>Непонятно — зачем у тебя два объекта s. Один локальный, другой глобальный.
А>в main нет объевления сета. я тупанул. Он у меня глобальный, я вот и думаю где лучше его объявить.
Ну, ведущие собаководы рекомендуют без нужды не использовать глобальные переменные.
Ибо чревато это всякими неожиданностями.
И дело даже не в использовании таких переменных, а их инициализации и разрушении. Для глобальных объектов это относительно неявный процесс.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
set.clear() освободится ли статическаая память
От:
Аноним
Дата:
08.01.09 09:52
Оценка:
Всем привет!
Посоветуйте как быть.
Eсть код:
class unique {
char buff[20]; // эта память будет размещена в стёке?
unique(char *p) { ... }
//...
};
set<unique> s;
int main ()
{
set<unique> s;
s.insert("zxc");
/// ...
s.clear();
}
после того как отработали с сетом и вызвали clear() статическая память освободится и будет использованна другими частами программы или нет?
Или лучше определить set в процедуре и по завершению её память освободится.
Re: set.clear() освободится ли статическаая память
class unique {
// Эта память будет размещена в объектеchar buff[20]; // эта память будет размещена в стёке?
unique(char *p) { ... }
//...
};
//Это типа глобальный объект
set<unique> s;
int main ()
{
// А это, типа, локальный объект
set<unique> s;
s.insert("zxc");
/// ...
s.clear();
}// В этой точке у тебя разрушится локальный объект
//А глобальный s будет разрушен внутри "системного" кода завершения работы программы
А>после того как отработали с сетом и вызвали clear() статическая память освободится и будет использованна другими частами программы или нет? А>Или лучше определить set в процедуре и по завершению её память освободится.
Когда вызывается std::set::clear разрушает объекты, хранящиеся в множестве (то есть вызывает ~unique). Память под эти объекты, он может не освобождать — повторно заюзает потом. Память он освободит в своем деструкторе std::set::~set. Этот деструктор вызовется автоматом.
Из приведенного кода, беспокоится об освобождении unique::buff не надо. Все будет освобождено автоматически.
Непонятно — зачем у тебя два объекта s. Один локальный, другой глобальный.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: set.clear() освободится ли статическаая память
Вообще-то это зависит от реализации. Практически, для MSVC сlear освободит всю память.
Нужно разобрать угил.
Re[2]: set.clear() освободится ли статическаая память
От:
Аноним
Дата:
08.01.09 11:40
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Непонятно — зачем у тебя два объекта s. Один локальный, другой глобальный.
в main нет объевления сета. я тупанул. Он у меня глобальный, я вот и думаю где лучше его объявить.
Еще в моей программи между добалениями в сет значений, выполняется другой код (но программа не многопоточная)
Компилятор у меня MinGW.
Re: set.clear() освободится ли статическаая память
А>после того как отработали с сетом и вызвали clear() статическая память освободится и будет использованна другими частами программы или нет?
Наверно ты имеешь ввиду динамическую память, выделяемую set-ом? Зависит от реализации set-а.
А>Или лучше определить set в процедуре и по завершению её память освободится.
По завершению функции "освободится" и стек, и динамическая память. Видимо это тебе и нужно. Такое действие происходит когда переменная выходит из зоны видимости, так что ты можешь легко сделать это не создавая отдельную функцию:
int main()
{
...
{
set<unique> s;
...
} // <- здесь освобождается память, занимаемая s
... здесь еще какой-то код
return 0;
};
Re[2]: set.clear() освободится ли статическаая память
От:
Аноним
Дата:
09.01.09 08:44
Оценка:
понятно спасибо.
Только еще не ясно почему buff[20] динамическая память, она должна ж быть статической?
char *buff = new [20] — вот это динамическая память...
Re[3]: set.clear() освободится ли статическаая память
Здравствуйте, <Аноним>, Вы писали:
А>Только еще не ясно почему buff[20] динамическая память, она должна ж быть статической? А>char *buff = new [20] — вот это динамическая память...
new char[20] — это заведомо динамическая память.
Член объекта char buff[20] — размещается в теле объекта. А где размещается объект? Если это элемент std::set — то в динамической памяти (как раз set делает new...)
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[2]: set.clear() освободится ли статическаая память
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, Аноним, Вы писали:
NBN>Вообще-то это зависит от реализации. Практически, для MSVC сlear освободит всю память.
Чтобы не зависеть, можно делать нечто такое:
// есть контейнер
std::set<int> s;
// как-то его юзаем
s.insert(1);
s.insert(2);
// теперь нужно гарантированно освободить память
// вместо s.clear() создаем временную переменную
// в "ограниченной" области видимости
// и "меняем их содержимое"
{
std::set<int> tmp;
std::swap(s, tmp);
}
// здесь память уже осободилась