Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 183

Долгое высвобождение памяти

19.02.2015, 22:55. Показов 3703. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Возможно, такой вопрос уже встречался, но ответа мне найти не удалось.
Намахал template List.
C++
1
2
3
4
5
6
7
8
9
10
~List(){
        Item *srh = (Item*)head, *dead;
        clock_t t1 = clock();
        while( srh ){
            dead = srh;
            srh = srh->next;
            delete (T*)dead; // используется наследование от Item. Удалить как class T.
        }
        plog("< %p: %p ms\n", this, clock()-t1 );
    };
100000 объектов T размера около 200b были созданы за 84 ms. Удалялся список 9937 ms.

Конечно, не так часто будут выделяться/освобождаться гигабайты памяти, но и, в случае необходимости, выгружать списки с данными из памяти по нескольку часов не будет радовать. Возможно как-то ускорить этот процесс и с чем связана такая длительность?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.02.2015, 22:55
Ответы с готовыми решениями:

Высвобождение динамической памяти
Нужна помощь, в проблеме высвобождения памяти, все делаю по стандартам С++, но постоянно выдает ошибки. Фото 1, в случае, если пытаюсь...

Корректное высвобождение памяти в list
У меня все нормально работает, ну и по логике тоже вроде нормально, но намучился с Коректным высвобождением памяти(ну пару раз упала...

Высвобождение памяти для 3 измерения массива
Здравствуйте. Не могу понять почему выходит ошибка. Я сделал 3х мерный массив, у которого 2 строки . Он неравномерный. В 1 строке 3...

47
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.02.2015, 23:10
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от hoggy Посмотреть сообщение
А кроме того: не совсем понятно, зачем мелкомягкие запихали структуру в шаблон.
А зачем ?
Цитата Сообщение от hoggy Посмотреть сообщение
так же, как и версии мингва, используется нешаблонная нода, которая ссылается сама на себя
Используется структура зависимая от аргументов шаблона.

Обратите внимание на поле класса:
C++
1
value_type _Myval;
Цитата Сообщение от hoggy Посмотреть сообщение
потому что по факту они используют её, как не шаблонную.
Никто не говорил что она сама по себе должна быть шаблонная.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.02.2015, 23:15
Цитата Сообщение от Avazart Посмотреть сообщение
Используется структура зависимая от аргументов шаблона.
А, ну да.

Ну может быть просто индусы постарались
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.02.2015, 23:35
Цитата Сообщение от hoggy Посмотреть сообщение
Ну может быть просто индусы постарались
Ну вот и я про то что ТС индус.
И что через void* это действительно смешно.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.02.2015, 23:44
Цитата Сообщение от Avazart Посмотреть сообщение
И что через void* это действительно смешно.
Индусы гонят шаблон без всякой надобности во все поля.

Я бы сделал через void*
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.02.2015, 23:47
hoggy значит в теме два индуса вы и ТС.

Прдон но я лично не понимаю зачем насаждать свою Си-религию в разделе плюсов.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.02.2015, 23:55
Цитата Сообщение от Avazart Посмотреть сообщение
hoggy значит в теме два индуса вы и ТС.
Если вы не выносите за пределы шаблона код,
который не зависит от параметров шаблона,
и не имеет смысла каждый раз заново инстанцировать под очередной параметр, то индус - это вы.

Если проектируя шаблон, вы не думаете о том, как организовать конструкцию так,
что бы максимум вынести наружу, то идус - это вы.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.02.2015, 23:58
hoggy, Идите в раздел Сей... и не давайте нелепых советов.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.02.2015, 00:01
смотрим на
http://llvm.org/viewvc/llvm-pr... iew=markup
реализацию std::map
в libc++ которая является реализацией STL для Clang'а
map агрегирует в себя __tree (реализация красно черных деревьев)
узлами __tree являются __tree_node
__tree_node унаследованы от __tree_node_base
который вообще хранит void *

Добавлено через 54 секунды
Цитата Сообщение от Avazart Посмотреть сообщение
Идите в раздел Сей... и не давайте нелепых советов.
не говорите мне что делать, и я не скажу вам, куда вам пойти.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
23.02.2015, 00:04
Avazart, hoggy, что то, что другое - выбор разработчиков. Этот выбор сделан не случайно и связан с общей архитектурой. Или всё это делалось "на авось"?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.02.2015, 00:20
Цитата Сообщение от hoggy Посмотреть сообщение
реализацию std::map
в libc++ которая является реализацией STL для Clang'а
map агрегирует в себя __tree (реализация красно черных деревьев)
узлами __tree являются __tree_node
__tree_node унаследованы от __tree_node_base
который вообще хранит void *
А конкретную ссылку на исходники именно этой структуры можно? и использования void*

Цитата Сообщение от Croessmah Посмотреть сообщение
Avazart, hoggy, что то, что другое - выбор разработчиков. Этот выбор сделан не случайно и связан с общей архитектурой. Или всё это делалось "на авось"?
Ну разработчики подобных библиотек могу много себе позволить. Вопрос конкретно в примере ТС.
Какой смысл именно тут лепить void* в списке?
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
23.02.2015, 00:26
Цитата Сообщение от Avazart Посмотреть сообщение
Какой смысл именно тут лепить void* в списке?
Ну, в посте ТС вообще-то каст к T*, а если кастовать к void*, то придется вручную вызывать деструктор до освобождения, ибо void* не содержит информации о типе и деструктор для удаляемого объекта не будет вызван.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.02.2015, 00:32
Цитата Сообщение от Avazart Посмотреть сообщение
А конкретную ссылку на исходники именно этой структуры можно? и использования void*
http://llvm.org/viewvc/llvm-pr... iew=markup

547 строка

Цитата Сообщение от Avazart Посмотреть сообщение
Какой смысл именно тут лепить void* в списке?
Шаблон - это по сути копипаста руками компилятора.

Смысл один - такая мера позволит сократить затраты на компиляцию,
и не допустить разбухания кода.

Большинство операция аля: srh = srh->next;
не нуждаются в знании типов.

Это можно вынести в нешаблонную структуру, которая будет рулить указателями.

Структурка наружу не торчит.
Что бы достать элемент - нужно попросить шаблонный агрегат.
Который знает точный тип элемента.
Он статик_кастом приведет к нужному типу.

Итого: безопасно, и код не разбухает от обилия автоматической копипасты.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.02.2015, 00:33
Ну вот я нашел __tree_node

строка 588
C++
1
2
3
4
5
6
7
8
9
10
11
template <class _Tp, class _VoidPtr>
    class __tree_node
    : public __tree_node_base<_VoidPtr>
    {
    public:
    typedef __tree_node_base<_VoidPtr> base;
    typedef _Tp value_type;
    
    value_type __value_;
    // ...
    };
http://llvm.org/viewvc/llvm-pr... iew=markup

Ну и где тут обещанный void*?
Есть конечно VoidPtr но думаю тут оно связано чисто для большей гибкости и переносимостью между платформами, а не потому что "побрезговали шаблонами".
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.02.2015, 00:33
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну, в посте ТС вообще-то каст к T*, а если кастовать к void*, то придется вручную вызывать деструктор до освобождения, ибо void* не содержит информации о типе и деструктор для удаляемого объекта не будет вызван.
Мой оппонент имел ввиду:
какой смысл держать указатели в void*, а потом кастить их к T&, а не наоборот.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.02.2015, 00:35
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну, в посте ТС вообще-то каст к T*, а если кастовать к void*, то придется вручную вызывать деструктор до освобождения, ибо void* не содержит информации о типе и деструктор для удаляемого объекта не будет вызван.
Ну я про то и говорил, смешно.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.02.2015, 00:35
Цитата Сообщение от Avazart Посмотреть сообщение
Есть конечно VoidPtr но думаю тут оно связано чисто для большей гибкости и переносимостью между платформами, а не потому что "побрезговали шаблонами"
Верно. Суть его в том, что это и есть void*.
Данный шаблон всегда инстанцируется одним и тем же типом.
Независимо от фактических параметров агрегата.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
23.02.2015, 00:37
Цитата Сообщение от hoggy Посмотреть сообщение
Мой оппонент имел ввиду
да я понял. Я сейчас конкретно о посте ТС.
Цитата Сообщение от hoggy Посмотреть сообщение
какой смысл держать указатели в void*
Но для такого хранения нужен дополнительный обвяз, как Вы и написали.
Цитата Сообщение от Avazart Посмотреть сообщение
Ну я про то и говорил, смешно.
В посте ТС такое решение будет смешно. А в контексте хорошо продуманной архитектуры может очень хорошо выглядеть.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.02.2015, 00:40
Цитата Сообщение от Croessmah Посмотреть сообщение
Но для такого хранения нужен дополнительный обвяз, как Вы и написали.
А этого самого "обвяза" не может не быть.
Он в любом случае есть, например std::list "обвяз" для своих кишок,
и знает точный тип элемента.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.02.2015, 00:40
Цитата Сообщение от hoggy Посмотреть сообщение
Верно. Суть его в том, что это и есть void*.
Данный шаблон всегда инстанцируется одним и тем же типом.
Независимо от фактических параметров агрегата.
Во первых это шаблон, во вторых VoidPtr это параметр этого шаблона а значит != void*, т.е по сути он может быть int и еще чем либо (вероятно это нужно на некоторых платформах, это естественно моя догадка нужно глубже копаться в исходниках.)
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.02.2015, 00:45
Цитата Сообщение от Avazart Посмотреть сообщение
Во первых это шаблон, во вторых VoidPtr это параметр этого шаблона а значит != void*, т.е по сути он может быть int
Нет, он именно void*
В более старых версиях (вы можете покапаться, там есть история коммитов) был голый void*
Потом уже сделали так.

Разумеется, его для того и сделали, что бы на какой нить платформе можно было вдуплить например int*

Но даже если на какой то платформе, по какой то причине вдуплят int*,
то это будет int* независимо от параметров агрегата.

Этот тип не зависит от параметров агрегата.
Это не тип элемента, и никакого отношения к типу элемента не имеет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.02.2015, 00:45

Очень долгое освобождение динамически выделенной памяти
Все никак не могу разобраться с одной проблеммой! У меня есть отображение, в котором хранятся указатели на абстрактный класс Node ...

Решение слишком долгое!
Добрый вечер всем, недавно начал изучать языки и многого не знаю. В целом разбираюсь неплохо, но не хватает практики. Написал программу...

Долгое завершение if (~1.500 мс)
Здравствуйте, в общем по какой-то причине операция if стала очень долго завершаться, все действия внутри себя выполняются очень быстро в...

Самое долгое слово в файле
Дали написать прогу: 1 Выводит из файла1 в файл2 строки где одно слово 2 Ищет во втором файле самое долгое слово 3 Считает количество...

Высвобождение памяти компонента
Добрый вечер, снова я. Не подскажите как организовать следующее: допустим я создаю динамический компонент при создании формы, скажем так: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru