Russian Qt Forum
Ноябрь 24, 2024, 20:23
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Причины утечки памяти и способы борьбы с ними
Страниц:
1
2
[
3
]
4
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Причины утечки памяти и способы борьбы с ними (Прочитано 26157 раз)
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Причины утечки памяти и способы борьбы с ними
«
Ответ #30 :
Февраль 16, 2014, 00:00 »
Цитата: kambala от Февраль 15, 2014, 23:06
так может уж лучше тогда тему-статью-туториал?
думаю не мне одному будет интересно.
Вот не умею я нормально писать. Давайте лучше это обсуждать в этой теме, например.
На самом деле, начать ими пользоваться очень легко с запуском нового проекта: просто берете и начинаете везде вместо обычных указателей использовать shared_ptr (не допуская циклических ссылок).
Писал, писал... какая то фигня получается...
Лучше будем обсуждать конкретные моменты.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Причины утечки памяти и способы борьбы с ними
«
Ответ #31 :
Февраль 16, 2014, 00:18 »
Цитата: Akon от Февраль 15, 2014, 23:10
если бы не было распространенных реализаций, вы бы сделали свою.
Так и делал...
В середине 90-х, шаблонов у меня в компиляторе еще не было (BC 3.1), и в каждый класс, у которого хотелось иметь такой функционал, подмешивал класс со счетчиком и методами attach/detach.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Причины утечки памяти и способы борьбы с ними
«
Ответ #32 :
Февраль 16, 2014, 11:10 »
Цитата: Old от Февраль 15, 2014, 20:28
Или вы хотели бы что бы он в боевом коде всех сохранял?
И это тоже бы хотел. Пример: N разнотипных объектов использует шареный ресурс, напр картинку. Все хорошо, как только все N будут удалены - и ресурс будет удален/выгружен. Но вот пользователь выбрал из меню "отключить картинки" - что делать? Как мне найти всех пользователей ресурса и сказать им "освобождай"?
А так да - экономит delete, удобно отдать в асинхронный вызов, и.т.п. с этим никто не спорит. Но каких-то больших результатов от "умности указателей" ожидать не стоит.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Причины утечки памяти и способы борьбы с ними
«
Ответ #33 :
Февраль 16, 2014, 11:22 »
Цитата: Igors от Февраль 16, 2014, 11:10
Но вот пользователь выбрал из меню "отключить картинки" - что делать? Как мне найти всех пользователей ресурса и сказать им "освобождай"?
Вы пытаетесь навязать дополнительный функционал указателю, который никак не связанный с его задачами. Вы часто пытетесь объединять разные задачи в одной сущности. Из этого никогда ничего хорошего не получиться.
Цитата: Igors от Февраль 16, 2014, 11:10
А так да - экономит delete, удобно отдать в асинхронный вызов, и.т.п. с этим никто не спорит.
Это одни из простейшитх задач, которые он ришает.
Цитата: Igors от Февраль 16, 2014, 11:10
Но каких-то больших результатов от "умности указателей" ожидать не стоит.
Так никто и не ждет. Это просто указатель.
Записан
Akon
Гость
Re: Причины утечки памяти и способы борьбы с ними
«
Ответ #34 :
Февраль 16, 2014, 11:44 »
Цитировать
И это тоже бы хотел. Пример: N разнотипных объектов использует шареный ресурс, напр картинку. Все хорошо, как только все N будут удалены - и ресурс будет удален/выгружен. Но вот пользователь выбрал из меню "отключить картинки" - что делать? Как мне найти всех пользователей ресурса и сказать им "освобождай"?
Это действительно никак не связано с смартами. Используйте контейнер со смартами под каждый ресурс. Отключили картинки - очистили контейнер.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Причины утечки памяти и способы борьбы с ними
«
Ответ #35 :
Февраль 16, 2014, 12:55 »
Цитата: Old от Февраль 16, 2014, 11:22
Вы пытаетесь навязать дополнительный функционал указателю, который никак не связанный с его задачами.
Цитата: Akon от Февраль 16, 2014, 11:44
Это действительно никак не связано с смартами.
Но ведь только что (пока не было этого противного требования "отключить" извне) все прекрасно вписывалось - завел в каждом классе умный указатель, и все! Только вот
Цитировать
этот редиска на первом скачке расколется
И придется возвращаться к тем самым attach/detach
Цитата: Akon от Февраль 16, 2014, 11:44
Используйте контейнер со смартами под каждый ресурс. Отключили картинки - очистили контейнер.
Не понял, если можно - подробнее. Напр как тогда рулить с точки зрения одного объекта (клиента)?
Записан
Johnik
Крякер
Online
Сообщений: 339
Re: Причины утечки памяти и способы борьбы с ними
«
Ответ #36 :
Февраль 16, 2014, 14:08 »
Цитата: Igors от Февраль 16, 2014, 11:10
Пример: N разнотипных объектов использует шареный ресурс, напр картинку. Все хорошо, как только все N будут удалены - и ресурс будет удален/выгружен. Но вот пользователь выбрал из меню "отключить картинки" - что делать? Как мне найти всех пользователей ресурса и сказать им "освобождай"?
Использовать текучие указатели в паре с умными.
Записан
Bepec
Гость
Re: Причины утечки памяти и способы борьбы с ними
«
Ответ #37 :
Февраль 16, 2014, 14:47 »
Умные указатели иногда выгодно использовать в "стандартных" реализациях. В остальных случаях лучше простые. Соединить две разные библиотеки, построенные на умных и простых указателях можно, но необходимо досконально знать и ту и ту библиотеку.
Это инструмент. Можно использовать эффективно и в нужной программе, а можно "микроскопом гвозди забивать".
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Причины утечки памяти и способы борьбы с ними
«
Ответ #38 :
Февраль 16, 2014, 14:48 »
Цитата: Igors от Февраль 16, 2014, 12:55
Но ведь только что (пока не было этого противного требования "отключить" извне) все прекрасно вписывалось - завел в каждом классе умный указатель, и все!
Конечно вписывалось, от него требовалось владеть объектом - он с этим прекрасно справлялся. Вы захотели, что бы он еще что-то помнил, но увы, без дополнительных телодвижений он этого не сможет, не закладывали в него этих способностей изначально (слава Богу).
Также он не сможет загружать контент с сайта, считать логарифмы и сохранять свое состояние в базу данных. Но он превосходно справится со своей непосредственной задачей.
Цитата: Akon от Февраль 16, 2014, 11:44
Не понял, если можно - подробнее. Напр как тогда рулить с точки зрения одного объекта (клиента)?
Посылайте сигнал/event всем объекта, при получении которого они забудут ресурс. Как только они все это сделают, ресурс разрушится.
«
Последнее редактирование: Февраль 16, 2014, 14:55 от Old
»
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Причины утечки памяти и способы борьбы с ними
«
Ответ #39 :
Февраль 16, 2014, 15:19 »
Цитата: Bepec от Февраль 16, 2014, 14:47
В остальных случаях лучше простые.
Тут нужно уточнять, кому лучше. Вам? Ну хорошо. Для меня простые указатели хуже.
Цитата: Bepec от Февраль 16, 2014, 14:47
Это инструмент. Можно использовать эффективно и в нужной программе, а можно "микроскопом гвозди забивать".
Это обычный указатель, не нужно его использовать в "нужной программе". Он хорош во всех программах.
Записан
Bepec
Гость
Re: Причины утечки памяти и способы борьбы с ними
«
Ответ #40 :
Февраль 16, 2014, 15:27 »
Я привёл пример - попробуйте скрестить библиотеку с простыми указателями и библиотеку с умными. И не простую динамическую dll, а полноценную библиотеку с взаимодействием.
PS это хорошо когда все и вся использует умные. Если что-то использует простые, вся схема рушится
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Причины утечки памяти и способы борьбы с ними
«
Ответ #41 :
Февраль 16, 2014, 15:34 »
Цитата: Bepec от Февраль 16, 2014, 15:27
PS это хорошо когда все и вся использует умные. Если что-то использует простые, вся схема рушится
Я выше это писал.
Если библиотека действительно ценна для проекта, то ее интерфейс закрывается фасадом с умными указателями и дальше все гармонично взаимодействует. А вот если вам лень это делать и обычные указатели из этой библиотеки лезут во все места проекта, то... наверное этот проект не очень важен или у вас много свободного времени на отслеживание всех этих указателей.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Причины утечки памяти и способы борьбы с ними
«
Ответ #42 :
Февраль 16, 2014, 16:41 »
Цитата: Old от Февраль 16, 2014, 14:48
Конечно вписывалось, от него требовалось владеть объектом - он с этим прекрасно справлялся. Вы захотели, что бы он еще что-то помнил, но увы, без дополнительных телодвижений он этого не сможет, не закладывали в него этих способностей изначально (слава Богу).
Также он не сможет загружать контент с сайта, считать логарифмы и сохранять свое состояние в базу данных. Но он превосходно справится со своей непосредственной задачей.
Так я же и не возражаю, а просто привожу пример как "умность" оказывается очень короткой. И таких примеров много
Цитата: Akon от Февраль 16, 2014, 11:44
Посылайте сигнал/event всем объекта, при получении которого они забудут ресурс. Как только они все это сделают, ресурс разрушится.
А каким "всем"? Откуда я их возьму/узнаю? И что послать? Нужно делать какой-то интерфейс понимаемый многими объектами
Да и в событийной схеме это проблемно.
Что мне не нравится во всех этих "умных" - что они берут на себя удаление. Схема "умный ресурс" гораздо мощнее, он также может удалить себя если нет клиентов, но + многое другое. А на стороне клиента возможности очень бедные.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Причины утечки памяти и способы борьбы с ними
«
Ответ #43 :
Февраль 16, 2014, 16:49 »
Цитата: Igors от Февраль 16, 2014, 16:41
просто привожу пример как "умность" оказывается очень короткой. И таких примеров много
Да, я выше писал, они контент с сайта получать не умеют, сохранять свои состояния в базе данных тоже, даже логарифм посчитать не могут. И кто назвал их умными?
Цитата: Igors от Февраль 16, 2014, 16:41
А каким "всем"? Откуда я их возьму/узнаю?
А вы их храните где-то. Вы только что хотели, что бы их хранили указатели, они не могут... значит их придется хранить вам.
Цитата: Igors от Февраль 16, 2014, 16:41
Да и в событийной схеме это проблемно.
В событийной схеме послать событие проблемно? Что то вы с ней не то делаете.
Цитата: Igors от Февраль 16, 2014, 16:41
Схема "умный ресурс" гораздо мощнее, он также может удалить себя если нет клиентов, но + многое другое. А на стороне клиента возможности очень бедные.
Ну так умный указатель это маленький винтик, с помощью которого легко сделать "умный ресурс" и даже "очень умный ресурс".
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Причины утечки памяти и способы борьбы с ними
«
Ответ #44 :
Февраль 16, 2014, 17:22 »
Цитата: Old от Февраль 16, 2014, 16:49
А вы их храните где-то. Вы только что хотели, что бы их хранили указатели, они не могут... значит их придется хранить вам.
Придется - так придется. Но у меня одно число указателей, а у каждого "умника" свое число ссылок, нехорошо, не по уму иметь 2 копии данных.
Цитата: Igors от Февраль 16, 2014, 16:41
В событийной схеме послать событие проблемно? Что то вы с ней не то делаете.
Послать-то без проблем, но никто не обещал что в очереди не появится событие которое опять вызовет захват того же ресурса.
Цитата: Igors от Февраль 16, 2014, 16:41
Ну так умный указатель это маленький винтик, с помощью которого легко сделать "умный ресурс" и даже "очень умный ресурс".
Это интересно обсудить, может создадим тему?
Записан
Страниц:
1
2
[
3
]
4
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...