|
Заблокирован
|
|||||||||||
Можно ли удалить объект экземпляра класса из самого себя?18.11.2014, 15:10. Показов 16781. Ответов 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
|
|
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 19.11.2014, 17:18 | ||
|
Тоже самое с QSharedPointer. Но в частном случае может работать, если все собирается одним компилятором с одними и теми же настройками (впрочем эта тема уже раскрыта в твоих предыдущих вопросах). Если ты не собираешься менять компилятор или передавать кому-то свою dll в скомпилированном виде, то можешь действительно на это забить и писать как писал. ______ * в пределах одной версии ABI. Если, скажем, dll написана в mingw, то заюзать ее в таком виде из VS не получится, из-за разных соглашений об ABI.
0
|
||
|
Заблокирован
|
||||||||||||||||||
| 19.11.2014, 18:39 [ТС] | ||||||||||||||||||
![]() Так в чём тут подвох - то? Вот создал я объект QSharedPointer в одной DLL и инициализировал его каким - то объектом:
Добавлено через 2 минуты
0
|
||||||||||||||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||
| 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
|
||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||||||||||||
| 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
|
|||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||||
| 19.11.2014, 20:36 | ||||||
GCC для Windows - это MinGW. Я изначально про него и говорил. Эту проблему решают обычно несколькими способами:1. Дают юзерам исходники, собирай подо что хочешь и как хочешь. 2. Дают юзерам собранные версии под каждый из поддерживаемых компиляторов. 3. Дают юзерам одну библиотеку, но которая работает на всех компиляторах (с использованием С-style интерфейсов (COM и т.п.)) )
1
|
||||||
|
Заблокирован
|
|||||||||||||||||||
| 19.11.2014, 20:52 [ТС] | |||||||||||||||||||
![]()
0
|
|||||||||||||||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||
| 19.11.2014, 21:07 | |||
|
1
|
|||
|
Заблокирован
|
|||
| 19.11.2014, 21:11 [ТС] | |||
![]() Давай дожмём уже этот вопрос ![]() Добавлено через 1 минуту Вот если б С++ 14 включал бы в себя какие - то элементы GUI или рендеры типа DirectX - вот это было бы дело
0
|
|||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||||||
| 19.11.2014, 21:12 | |||||||
0
|
|||||||
|
Заблокирован
|
||
| 19.11.2014, 21:16 [ТС] | ||
|
Спасибо тебе о великий ДокторСмещение за просветление моего окисленного котелка ![]()
0
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|
| 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
|
||||||||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|
| 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 | |
|
Можно ли заставить класс записывать самого себя в файл? Как можно удалить или очистить тело макроса после его исполнения из самого себя?
Зацыкливания класса на самого себя Как экземпляру класса изменить тип самого себя? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы
Всем привет! Хочу поделиться свежим (и довольно. . .
|
|
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
|
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения:
- добавлена многоязычность
- добавлено снятие скриншотов
- добавлено поддержание бафов хождения по воде (для жреца, дк и шамана)
- и так, по. . .
|
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу)))
Критические ошибки, мешающие компиляции и. . .
|
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата)
Этот документ предназначен для того, чтобы новый чат Claude мог продолжить
работу без необходимости заново разбираться в. . .
|