|
Заблокирован
|
|||||||||||
Можно ли удалить объект экземпляра класса из самого себя?18.11.2014, 15:10. Показов 17488. Ответов 67
Метки нет (Все метки)
Привет!
Допустим:
![]() Добавлено через 4 минуты Вот так вроде работает, но как - то это ..... Так память нормально освобождается?
![]() Добавлено через 4 минуты Нашёл себе методичку: http://www.parashift.com/c++-f... -this.html
0
|
|||||||||||
| 18.11.2014, 15:10 | |
|
Ответы с готовыми решениями:
67
Удаление экземпляра класса в функции самого класса (Ошибка при отладке) как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса? |
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 19.11.2014, 13:17 | |
|
-THE_MASTER666-, Нет, очень быстрый неслабо так растяжимое понятие. Можно посмотреть на http://www.boost.org/doc/libs/... index.html
1
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 19.11.2014, 17:18 | ||
|
Тоже самое с QSharedPointer. Но в частном случае может работать, если все собирается одним компилятором с одними и теми же настройками (впрочем эта тема уже раскрыта в твоих предыдущих вопросах). Если ты не собираешься менять компилятор или передавать кому-то свою dll в скомпилированном виде, то можешь действительно на это забить и писать как писал. ______ * в пределах одной версии ABI. Если, скажем, dll написана в mingw, то заюзать ее в таком виде из VS не получится, из-за разных соглашений об ABI.
0
|
||
|
Заблокирован
|
||||||||||||||||||
| 19.11.2014, 18:39 [ТС] | ||||||||||||||||||
![]() Так в чём тут подвох - то? Вот создал я объект QSharedPointer в одной DLL и инициализировал его каким - то объектом:
Добавлено через 2 минуты
0
|
||||||||||||||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||
| 19.11.2014, 18:56 | |||
|
Смотри 337 строку. Видишь там delete? Этот файл будет независимо вкомпилен и в dll и в exe при использовании QSharedPtr. Все хорошо пока exe и dll делят общий runtime, а если нет, или же это разные компиляторы (версии), либо разные настройки (debug\release и т.п.), то это будут разные delete. Решить проблему с разными runtime можно используя custom deleter у QSharedPtr (см. тут), но это все равно не решит проблему разных ABI, если кто-то захочет твою dll, написанную, скажем, в MinGW использовать в VS. Но эта проблема более комплексная, т.к. затрагивает и Qt (у нее весь интерфейс на С++, а значит версия Qt для VS в любом случае не подойдет для MinGW). Добавлено через 51 секунду
1
|
|||
|
Заблокирован
|
||||||
| 19.11.2014, 19:49 [ТС] | ||||||
В моём случае в классе MyObj? А что именно туда сохранить нужно, вот конкретно, можно хоть пару строк примерЧеГа ? ![]() То есть в любом случае, если я создал QSharedPointer в DLL, и жду его авто удаления при выходе за скоп уже в ЕХЕ, мне надо будет в любом случае что - то вручную вызывать? Тогда зачем вообще нужен этот шаред пойнтер ... Можно хоть совсем чуть чуть сорца в студию ![]() ![]() Добавлено через 1 минуту Добавлено через 36 секунд Добавлено через 6 минут
0
|
||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||||||||||||
| 19.11.2014, 20:09 | |||||||||||||
|
В случае GCC и VS, возникают гораздо более серьезные проблемы, т.к С++ ABI у них несовместимо, следовательно ты даже скомпилировать ничего не сможешь до тех пор, пока используешь интерфейсы в стиле С++ (но сможешь, если использовать С). Добавлено через 3 минуты ![]() Вот отрывок примера из MSDN:
Добавлено через 42 секунды Добавлено через 28 секунд
1
|
|||||||||||||
|
Заблокирован
|
|||||
| 19.11.2014, 20:18 [ТС] | |||||
|
Я вообще не любитель оставлять рантаймы наружу, ведь я же в студии эти рантаймы статической линковкой DLL могу внутрь загнать и тогда по идее проблем же не должно быть? ![]() ![]() В общем если у меня большой проект, который я собираю под Windows/Linux/Max разными компиляторами, под каждую ось - свой. Каждую ночь сервер сборки собирает проект под три оси. Если поменяется версия компилятора, то под конкретную ось всё пересобирается. То есть по сути у меня для конкретной оси компилятор один и тот же и в случае смены его версии я полностью пересобираю проект, в таком случае подобных проблем, описанных выше, быть не должно же, верно? Т.к. если я теряю последнюю ссылку на QSharedPointer и аналоги в ЕХЕ, создав его в DLL, то в ЕХЕ он и удалиться, что не правильно, так ?
0
|
|||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||||||
| 19.11.2014, 20:36 | ||||||
GCC для Windows - это MinGW. Я изначально про него и говорил. Эту проблему решают обычно несколькими способами:1. Дают юзерам исходники, собирай подо что хочешь и как хочешь. 2. Дают юзерам собранные версии под каждый из поддерживаемых компиляторов. 3. Дают юзерам одну библиотеку, но которая работает на всех компиляторах (с использованием С-style интерфейсов (COM и т.п.)) )
1
|
||||||
|
Заблокирован
|
|||||||||||||||||||
| 19.11.2014, 20:52 [ТС] | |||||||||||||||||||
![]()
0
|
|||||||||||||||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||
| 19.11.2014, 21:07 | |||
|
1
|
|||
|
Заблокирован
|
|||
| 19.11.2014, 21:11 [ТС] | |||
![]() Давай дожмём уже этот вопрос ![]() Добавлено через 1 минуту Вот если б С++ 14 включал бы в себя какие - то элементы GUI или рендеры типа DirectX - вот это было бы дело
0
|
|||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||||||
| 19.11.2014, 21:12 | |||||||
0
|
|||||||
|
Заблокирован
|
||
| 19.11.2014, 21:16 [ТС] | ||
|
Спасибо тебе о великий ДокторСмещение за просветление моего окисленного котелка ![]()
0
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|
| 19.11.2014, 21:26 | |
|
1
|
|
|
Заблокирован
|
||
| 19.11.2014, 21:30 [ТС] | ||
|
Ведь если он статик, то хз как там устроен этот QSharedPointer внутри, может в ЕХЕ он вызовет как - то делетор их ЕХЕ ...ахаха ну не знаю... Настораживает просто, ладно. Раз со статиком правильно - да будет так
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 19.11.2014, 21:48 | ||
|
По стандарту this не может быть невалидным.
1
|
||
|
Ушел с форума
|
|
| 19.11.2014, 22:09 | |
|
Здесь нет UB. Обычное удаление объекта, созданного new, через указатель.
Без этой конструкции ни один смарт-поинтер нельзя было бы написать. В Boost, кстати, она в куче мест используется, в тех же потрохах shared_ptr.
1
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||
| 19.11.2014, 22:20 | ||||||||||||
|
Удаление объекта через указатель снаружи - это запуск его диструктора, и освобождение памяти. Удаление объекта через указатель this - это освобождение памяти в момент, когда диструктор ещё не отработал. Что в свою очередь опять запускает деструктор, а затем пытается освободить память... http://rextester.com/HHPM24793
А в том, что в любом контексте, где доступен this (скоуп, в котором виден this объекта) this должен быть валиден. Где то на хабре были статейки, о том, как лихо компилятор выпиливает проверки вида:
0
|
||||||||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|
| 19.11.2014, 22:30 | |
|
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 19.11.2014, 22:32 | |
|
0
|
|
| 19.11.2014, 22:32 | |
|
Можно ли заставить класс записывать самого себя в файл? Как можно удалить или очистить тело макроса после его исполнения из самого себя?
Зацыкливания класса на самого себя Как экземпляру класса изменить тип самого себя? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки.
Добавлено:
- Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
|
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы.
Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
|
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
|
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|