Booster <<Find and Replace. ^) Спасибо огромное! Очень выручили! Работает! А то чтоб одну переменную переименовать полчаса уходило, сейчас с Вашим методом за минуту!
Жжош. Вообще-то во всех редакторах такая функция есть. По крайней мере, текстовых. В любом случае, поздравляю. Теперь твоя работа сильно убыстрится)
Товарищи,есть здесь утечка памяти или нет? Не подскажите В коде: void foo() { Cluster *p = new Cluster; ....... return; } при выходе p из области видимости, delete автоматом вызывается или руками надо?
Не, автоматом не вызывается. Нужно писать delete в том месте, где хочешь удалить. В таком случае: Код (Text): Claster claster; деструктор вызовется автоматически. А утечка есть, да.
Или логически подумать. Ну вот создал ты объект в этой функции, а использовать будешь в другой. И как ты это сделаешь, если он удалится автоматически?
Booster Есть в этом доля правды. Многие концепции очень красиво могут быть реализованы на нём. Например, на LISP'e изначально был реализован GC в .NET, потому что на нём можно более чётко выразить семантику объектов в памяти. Потом уже переписали на С++.
Sasha7b9 <<Не, автоматом не вызывается. Нужно писать delete в том месте, где хочешь удалить. Delete для локальной pcluster нельзя вроде ипользовать, возвращать функции будет нечего! Cluster Transformer::Get_Cluster() { list_iter=plist->begin(); Cluster *pcluster=new Cluster; *pcluster=*list_iter; list_iter=plist->erase(list_iter); count--; return(*pcluster); } Нужно каким-то чудом вернуть кластер в main и при этом освободить в списке память которую он занимал. Я написал конструктор копий для объекта Кластер и возвращаю по значению локальный объект. Утекает ли память при каждом вызове функции под объект *pcluster? 10 вызовов и память объемом в 10 объектов кластер утекла или нет? Cluster Transformer::Get_Cluster() { list_iter=plist->begin(); Cluster thecluster; thecluster=*list_iter; list_iter=plist->erase(list_iter); count--; return(thecluster); } А так наверное уже не утекает. Для thecluster - деструктор вызывается при выходе из видимости.
http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx Экспериментируйте на здоровье - утекает, не утекает.
Спасибо за советы! Проверил диспетчером задач! При первом варианте при генерации миллиона кластеров около полгигабайта памяти утекает. При втором варианте приложение требует себе только 236 Кбайт памяти и также генерирует миллион кластеров. Утечек нет.
Конечно утекает, а что её делать? Этой строкой объект просто берётся по значению и копируется: Только в чём смысл выделять объект в динамической памяти, а потом использовать его как локальный в другой функции. Бред. Книгу читайте умную.
NafanyaТы с терминологией ничего не напутал? Если каждый твой кластер занимает 512 байт памяти, то при создании млн. штук приложение возьмёт полгигабайта. А если берёт всего 236 кбайт, значит, где-то ошибка, разве нет?
Sasha7b9 <<А если берёт всего 236 кбайт, значит, где-то ошибка, разве нет? Нет. Так как передали,допутим, 20 отсчетов преобразователю, он из них сформировал кластер и вернул его, затем на экран кластер вывели и память, что он занимал освободили. Затем следующие отсчёты идут пока кластер не сформируется. На проходе кластеризация идет. РЛС ведь без остановки крутится, памяти никакой не хватит, если все кластера хранить. Отработал один кластер, потом он не актуален, его можно удалять.
Nafanya все не все, но много хранить можно именно в случае рлс удаление будет глупостью большой. и времени возьмет, и с большой вероятностью к фрагментации приведет при длительной работе (рлс же долго должны непрерывно воркать)
qqwe <<именно в случае рлс удаление будет глупостью большой Я делаю так,как в ТЗ написано. ТЗ не я составляю. Оператор преобразует последовательность отсчетов по сложным алгоритмам в последовательность кластеров. Как только оператор сформирует кластер и выкинет его, больше он уже нигде не хранится.
Nafanya а при чем тут ТЗ? это отсчеты не хранятся, а как это относится к работе с памятью? вот, например, что вы тут обсуждаете, если у вас в ТЗ есть настолько четкие указания, что вы можете делать строго по ним? впрочем, то дело ваше. лепите тупо. индусом больше, индусом меньше.
qqwe <<а при чем тут ТЗ? Если не выполниться хоть одно требование технического задания - покроют матом Ну на самом деле просто пошлют переделывать. <<как это относится к работе с памятью? Работа с памятью тут обязательна, т.к. отсчеты идут миллионами и если что не так пойдет оперативу скушает приложение моментально. Вот в результате обсуждения,сегодня нашел и искоренил одну утечку.