URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2944
[ Назад ]

Исходное сообщение
"утечка памяти"

Отправлено fura13 , 19-Май-04 16:55 
  Есть такой тип в C++ string . Приведу пример :
int main(void)
{
string s;
s = "any text";
return 0;
}
Вот там где s = "any text" выделяется память под переменную s . Память берется из кучи (heap). Так вот он память не возвращает, пока не не произойдет завершение процесса и высвобождает память уже сама операционная система. Подскажите способ как эту память все таки удалить до завершения процесса?

Содержание

Сообщения в этом обсуждении
"утечка памяти"
Отправлено Alexander S. Salieff , 19-Май-04 17:29 
>  Есть такой тип в C++ string . Приведу пример :
>
>int main(void)
>{
>string s;
>s = "any text";
>return 0;
>}
>Вот там где s = "any text" выделяется память под переменную s
>. Память берется из кучи (heap). Так вот он память не
>возвращает, пока не не произойдет завершение процесса и высвобождает память уже
>сама операционная система. Подскажите способ как эту память все таки удалить
>до завершения процесса?

Че за бред? ;)
Или область видимости отконфигури, чтобы при выходе из нее автоматическая переменная удалялась, или заюзай динамическое создание через указатель, и сам создавай удаляй - скока влезет...


"утечка памяти"
Отправлено Alexander S. Salieff , 19-Май-04 17:31 
Не, ну блин... Утечка... Е-мае ;)))))
А вот ты говоришь main(){int a=10;}, и там аж 4 байта резервируюцца. И удаляюцца ведь, гады, только по завершении процесса ;)))) Тоже утечка? ;) Кругом одни утечки тогда, хз, куда от них дется ;)))))

"утечка памяти"
Отправлено AnToXa , 19-Май-04 17:34 
>  Есть такой тип в C++ string . Приведу пример :
>
>int main(void)
>{
>string s;
>s = "any text";
>return 0;
>}
>Вот там где s = "any text" выделяется память под переменную s
>. Память берется из кучи (heap). Так вот он память не
>возвращает, пока не не произойдет завершение процесса и высвобождает память уже
>сама операционная система. Подскажите способ как эту память все таки удалить
>до завершения процесса?

вы бредите.
автоматическая переменная типа std::string уничтожается при раскрутке стека перед выходом из main и вызывается деструктор std::string который освобождает память.
сделайте простейший враппер над std::string и увидите.



"утечка памяти"
Отправлено Alexander S. Salieff , 19-Май-04 17:50 
>вы бредите.
>автоматическая переменная типа std::string уничтожается при раскрутке стека перед выходом из main
>и вызывается деструктор std::string который освобождает память.
>сделайте простейший враппер над std::string и увидите.

Я не думаю, что человеку ведомы раскрутки стека, вероятно он это и имел ввиду под словом "высвобождает сама операционная система" (интересно, каким именно образом он отслеживал точку высвобождения? ;). Автора возмущает сам факт, почему компилятор не догадался, что автору больше не нужна автоматическая переменная, и не удалил ее до выхода из области видимости? ;))) А ведь мог бы, если бы захотел и постарался ;)))
Блин, я ща помру ;)

Почему люди не считают нужным хотя бы ознакомится с ртфмом под названием "Язык С++" авторства малоизвестного человека по имени Бьярн Страуструп?


"утечка памяти"
Отправлено AnToXa , 19-Май-04 18:02 
>Я не думаю, что человеку ведомы раскрутки стека, вероятно он это и
>имел ввиду под словом "высвобождает сама операционная система" (интересно, каким именно
>образом он отслеживал точку высвобождения? ;). Автора возмущает сам факт, почему
>компилятор не догадался, что автору больше не нужна автоматическая переменная, и
>не удалил ее до выхода из области видимости? ;))) А ведь
>мог бы, если бы захотел и постарался ;)))
>Блин, я ща помру ;)

хех, ну раскрутку стека производит libstdc++ все-таки, а не система :)

>Почему люди не считают нужным хотя бы ознакомится с ртфмом под названием
>"Язык С++" авторства малоизвестного человека по имени Бьярн Страуструп?
такие вот они, люди :)
почему вы думаете большинство "программистов на C++" используют язык как C с классами, имхо отсюда большинство нападок на C++.

ладно, старческое ворчание :)


"утечка памяти"
Отправлено fura13 , 20-Май-04 08:29 
  Извиняюсь что не правильно поставил вопрос. Да к сожалению я не очень пока хорошо знаю С++. Я хотел узнать нет ли в типе string явнового способа для высвобождения памяти. Про область видимости я знаю, не могу понять почему память не высвобождается. String у меня находится в структуре которую я размещаю в динамической памяти. Стринг у меня в структуре статик, ну т.е. :
struct st{
  int name;
  string s;
};
Программа у меня в идеале должна работать довольно долго(бесконечно). Но работает всего четыре дня(запускаю с помощью nohup). По команде top явно видно что растет size и res.

"утечка памяти"
Отправлено SergeiZz , 20-Май-04 09:38 
>  Извиняюсь что не правильно поставил вопрос.
Вопрос поставлен правильно, но вопрос детский...

>Да к сожалению я не очень пока хорошо знаю С++.
...И форум -- не лучшее место для его изучения...

>Я хотел узнать нет ли
>в типе string явнового способа для высвобождения памяти.
Есть, ессестввенно.

>String у
>меня находится в структуре которую я размещаю в динамической памяти. >Стринг у меня в структуре статик,
Это неверное заключение. Статик -- это совсем другое.

>ну т.е. :
>struct st{
>  int name;
>  string s;
>};
> Программа у меня в идеале должна работать довольно долго(бесконечно). Но работает
>всего четыре дня(запускаю с помощью nohup). По команде top явно видно
>что растет size и res.
Как только возникнет необходимость освободить память, выделенную под s
(а когда это будет знаете только Вы сами), вызовите явно деструктор string:

string str= "Hello!";
// ...
str.~string();

Читать по C++ рекомендую недавно изданную книгу Лафоре:
http://www.books.ru/shop?search_type=+&query=КЮТНПЕ&x=0&y=0


"утечка памяти"
Отправлено AnToXa , 20-Май-04 15:54 
>>String у
>>меня находится в структуре которую я размещаю в динамической памяти. >Стринг у меня в структуре статик,
>Это неверное заключение. Статик -- это совсем другое.
угу, это не static, это просто "by value".


>>всего четыре дня(запускаю с помощью nohup). По команде top явно видно
>>что растет size и res.
скорее всего память растет не из-за string :)
может быть из-за того, что вы просто не делаете delete на эту самую свою структуру

>Как только возникнет необходимость освободить память, выделенную под s
>(а когда это будет знаете только Вы сами), вызовите явно деструктор string:
>
>
>string str= "Hello!";
>// ...
>str.~string();
для очистки string лучше использовать str.clear(), ибо явно вызывая деструктор можно поиметь некоторые проблемы, ибо насколько я помню стандарт не оговаривает, что деструктор должен оставлять объект в consistent state, и даже если в конкретной реализации это так, то все равно можно нарваться на двойной вызов деструктора.