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() освободится ли статическаая память
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 08.01.09 10:23
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Eсть код:

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() освободится ли статическаая память
От: NikeByNike Россия  
Дата: 08.01.09 10:39
Оценка:
Здравствуйте, Аноним, Вы писали:

Вообще-то это зависит от реализации. Практически, для MSVC сlear освободит всю память.
Нужно разобрать угил.
Re[2]: set.clear() освободится ли статическаая память
От: Аноним  
Дата: 08.01.09 11:40
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Непонятно — зачем у тебя два объекта s. Один локальный, другой глобальный.


в main нет объевления сета. я тупанул. Он у меня глобальный, я вот и думаю где лучше его объявить.
Еще в моей программи между добалениями в сет значений, выполняется другой код (но программа не многопоточная)

Компилятор у меня MinGW.
Re[3]: set.clear() освободится ли статическаая память
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 08.01.09 11:53
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>>Непонятно — зачем у тебя два объекта s. Один локальный, другой глобальный.


А>в main нет объевления сета. я тупанул. Он у меня глобальный, я вот и думаю где лучше его объявить.


Ну, ведущие собаководы рекомендуют без нужды не использовать глобальные переменные.

Ибо чревато это всякими неожиданностями.

И дело даже не в использовании таких переменных, а их инициализации и разрушении. Для глобальных объектов это относительно неявный процесс.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: set.clear() освободится ли статическаая память
От: sraider http://dvinogradov.blogspot.com
Дата: 08.01.09 16:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Всем привет!

А>Посоветуйте как быть.

А>Eсть код:

А>
А>class unique {
А>    char buff[20]; // эта память будет размещена в стёке?
А>


Нет.

А>
А>    unique(char *p) { ... }
А>    //...
А>};

А>set<unique> s;

А>int main ()
А>{
А>    set<unique> s;
А>    s.insert("zxc");
А>    /// ...
А>    s.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() освободится ли статическаая память
От: Кодт Россия  
Дата: 09.01.09 11:05
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Только еще не ясно почему 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() освободится ли статическаая память
От: sc Россия  
Дата: 10.01.09 07:13
Оценка:
Здравствуйте, 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);
    }
    // здесь память уже осободилась
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.