Языки програмирования

Тема в разделе "WASM.HEAP", создана пользователем Blackbeam, 24 окт 2010.

  1. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Nafanya
    поставьте visual assist x
     
  2. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Booster
    <<Find and Replace. ^)
    Спасибо огромное! Очень выручили! Работает! А то чтоб одну переменную переименовать полчаса уходило, сейчас с Вашим методом за минуту!
     
  3. Sasha7b9

    Sasha7b9 New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2010
    Сообщения:
    105
    Жжош.
    Вообще-то во всех редакторах такая функция есть. По крайней мере, текстовых.
    В любом случае, поздравляю. Теперь твоя работа сильно убыстрится)
     
  4. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Товарищи,есть здесь утечка памяти или нет? Не подскажите
    В коде:
    void foo()
    {
    Cluster *p = new Cluster;
    .......
    return;
    }
    при выходе p из области видимости, delete автоматом вызывается или руками надо?
     
  5. Sasha7b9

    Sasha7b9 New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2010
    Сообщения:
    105
    Не, автоматом не вызывается. Нужно писать delete в том месте, где хочешь удалить.
    В таком случае:
    Код (Text):
    1. Claster claster;
    деструктор вызовется автоматически.
    А утечка есть, да.
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Nafanya
    В С++ ручками нужно вызывать delete. Нифига себе программист пошёл. А как же книжки читать?
     
  7. Sasha7b9

    Sasha7b9 New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2010
    Сообщения:
    105
    Или логически подумать. Ну вот создал ты объект в этой функции, а использовать будешь в другой. И как ты это сделаешь, если он удалится автоматически?
     
  8. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Использовать умные указатели.
    Либо возвращать по ссылке.
     
  9. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Booster
    Есть в этом доля правды. Многие концепции очень красиво могут быть реализованы на нём.
    Например, на LISP'e изначально был реализован GC в .NET, потому что на нём можно более чётко выразить семантику объектов в памяти. Потом уже переписали на С++.
     
  10. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    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 - деструктор вызывается при выходе из видимости.
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx
    Экспериментируйте на здоровье - утекает, не утекает.
     
  12. artkar

    artkar New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2005
    Сообщения:
    400
    Адрес:
    Russia
    Или C# :)
     
  13. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Спасибо за советы! Проверил диспетчером задач! При первом варианте при генерации миллиона кластеров около полгигабайта памяти утекает.
    При втором варианте приложение требует себе только 236 Кбайт памяти и также генерирует миллион кластеров. Утечек нет.
     
  14. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Конечно утекает, а что её делать? Этой строкой объект просто берётся по значению и копируется:

    Только в чём смысл выделять объект в динамической памяти, а потом использовать его как локальный в другой функции. Бред.

    Книгу читайте умную.
     
  15. Sasha7b9

    Sasha7b9 New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2010
    Сообщения:
    105
    NafanyaТы с терминологией ничего не напутал? Если каждый твой кластер занимает 512 байт памяти, то при создании млн. штук приложение возьмёт полгигабайта.
    А если берёт всего 236 кбайт, значит, где-то ошибка, разве нет?
     
  16. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Sasha7b9
    <<А если берёт всего 236 кбайт, значит, где-то ошибка, разве нет?
    Нет. Так как передали,допутим, 20 отсчетов преобразователю, он из них сформировал кластер и вернул его, затем на экран кластер вывели и память, что он занимал освободили. Затем следующие отсчёты идут пока кластер не сформируется. На проходе кластеризация идет.

    РЛС ведь без остановки крутится, памяти никакой не хватит, если все кластера хранить.
    Отработал один кластер, потом он не актуален, его можно удалять.
     
  17. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Nafanya
    все не все, но много хранить можно
    именно в случае рлс удаление будет глупостью большой. и времени возьмет, и с большой вероятностью к фрагментации приведет при длительной работе (рлс же долго должны непрерывно воркать)
     
  18. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    qqwe
    <<именно в случае рлс удаление будет глупостью большой

    Я делаю так,как в ТЗ написано. ТЗ не я составляю.
    Оператор преобразует последовательность отсчетов по сложным алгоритмам в последовательность кластеров. Как только оператор сформирует кластер и выкинет его, больше он уже нигде не хранится.
     
  19. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Nafanya
    а при чем тут ТЗ? это отсчеты не хранятся, а как это относится к работе с памятью? вот, например, что вы тут обсуждаете, если у вас в ТЗ есть настолько четкие указания, что вы можете делать строго по ним?

    впрочем, то дело ваше. лепите тупо. индусом больше, индусом меньше.
     
  20. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    qqwe
    <<а при чем тут ТЗ?
    Если не выполниться хоть одно требование технического задания - покроют матом:) Ну на самом деле просто пошлют переделывать.
    <<как это относится к работе с памятью?
    Работа с памятью тут обязательна, т.к. отсчеты идут миллионами и если что не так пойдет оперативу скушает приложение моментально.
    Вот в результате обсуждения,сегодня нашел и искоренил одну утечку.