|
1 / 1 / 0
Регистрация: 08.08.2021
Сообщений: 18
|
||||||
Компилятор игнорирует создание экземпляра класса из-за оптимизации23.10.2021, 15:37. Показов 5370. Ответов 14
Метки нет (Все метки)
Здравствуйте! Премного благодарю вас, что решили вникнуть в суть вопроса, а, возможно, даже помочь.
Работаю в Visual Studio 2019 - проект стабильно работает без ошибок в Debug x64/x86 версиях, но мне требуется перевести программу в стабильную Release версию, в которой компилятор игнорирует важный участок кода, который отвечает за создание экземпляров различных классов, наследуемых от одного абстрактного класса. Этого можно избежать, если полностью отключить оптимизацию, что не желательно. Как можно предотвратить ошибку в данной ситуации? Я считаю, что в этом нет особого смысла, но на всякий случай предоставлю данный участок кода из main функции, который игнорируется. Здесь я присваиваю константной ссылке основного производного класса его различных потомков, которые используются в будущем при помощи общего интерфейса. Кликните здесь для просмотра всего текста
0
|
||||||
| 23.10.2021, 15:37 | |
|
Ответы с готовыми решениями:
14
Создание экземпляра класса - наследника экземпляра другого класса Создание нового экземпляра дочернего класса из экземпляра базового Создание экземпляра класса, разрушение экземпляра класса |
|
147 / 135 / 50
Регистрация: 14.05.2021
Сообщений: 642
|
|
| 23.10.2021, 15:57 | |
|
С чего ты взял, что это компилятор что-то делает, а не просто ошибка в твоем коде?
0
|
|
|
1 / 1 / 0
Регистрация: 08.08.2021
Сообщений: 18
|
||
| 24.10.2021, 21:01 [ТС] | ||
|
psergee, хочу обратить ваше внимание на цитирование моих слов.
0
|
||
|
147 / 135 / 50
Регистрация: 14.05.2021
Сообщений: 642
|
||
| 26.10.2021, 15:28 | ||
|
В конце концов, у тебя есть полный код и дебаггер. Проверь в нем, что там у тебя происходит, и что там "игнорируется".
0
|
||
|
1 / 1 / 0
Регистрация: 08.08.2021
Сообщений: 18
|
||||||
| 26.10.2021, 22:41 [ТС] | ||||||
|
С момента публикации данной темы я могу описать подробнее проблему:
Я воспользовался вашим советом - хочешь решить проблему, то решай её сам. Ранее можно видеть, что мной использовались для хранения полиморфных объектов абстрактных классов константные ссылки, при инициализации которых r-values значением гарантированно продлевают срок хранения последних в соответствии со временем своей жизни (нахождения в области видимости), в данном случае до окончания работы программы - вся функция main, что исключало стирание данных. Данный факт решено было проверить (сборка release x64 с оптимизацией), скриншот прилагаю: Мной было замечено нечто интересное. Переменная инициализировалась так как и должна, но компилятор показывает, что отсутствует указатель __vfptr из таблицы виртуальных методов. Спрашивается почему? Отнюдь не знаю... Ведь, как я, повторяюсь, говорил ранее, что при отключении оптимизации, как при помощи директивы, описанной ниже, так и при помощи настроек компилятора, всё работает стабильно: Кликните здесь для просмотра всего текста
Без оптимизации всё работает - указатель указывает на конкретный адрес. Однако мной было замечено, что при явном выделении памяти из кучи (я использовал smart poiner), всё будет работать так же стабильно, с чем это связано? Отнюдь не знаю... Буду очень признателен, если Вы потратите немного своего драгоценного времени, psergee, чтобы вы могли удостовериться в этом сами! Кликните здесь для просмотра всего текста
Хоть такая проблема всего и одна, но именно с такой подобной описанной выше встречаюсь впервые. Получается, что я сам нашёл решение своей проблемы, как бы иронично это не звучало. Надеюсь, я смог кому-то помочь в похожей ситуации и так же смог переубедить psergee, что код, написанный мной, не содержит никаких ошибок с моей стороны, как runtime, так и каких либо других. Если кто-то знает ответ на вопрос: "Почему не инициализируется указатель на виртуальный метод из таблицы виртуальных методов в режиме оптимизации?", то буду крайне признателен за Ваш ответ!
0
|
||||||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||||||
| 26.10.2021, 23:54 | |||||||
|
Первая строчка в main(это касается и последующих):
Factory::Family?
1
|
|||||||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|||
| 27.10.2021, 08:57 | |||
shared_ptr. Его конструктор сохраняет правильный deleter в соответствии с переданным типом.Работа с дохлыми объектами как раз и может приводить к описанным автором спецэффектам. Добавлено через 4 минуты Sidr, Это, кстати, достаточно распространенная ошибка полагать, что время жизни продлевается и в таких случаях. Ну и еще более распространенная ошибка обвинять в таких случаях компилятор. Сколько бы опыта у вас ни было, всегда нужно подвергать критике свои действия и знания.
1
|
|||
|
1 / 1 / 0
Регистрация: 08.08.2021
Сообщений: 18
|
|||||
| 27.10.2021, 09:57 [ТС] | |||||
|
Или дело не в продолжительности хранения? ![]() Я проверял, на скриншотах видно, что адрес указывает на область памяти, выделенной для объекта. Или я что-то не понимаю? Особенно остро вопрос стоит для указателя на виртуальную функцию. Тут я тоже не могу понять, почему это происходит
0
|
|||||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||||||||||
| 27.10.2021, 10:24 | ||||||||||
Сообщение было отмечено Sidr как решение
Решениеhttps://eel.is/c++draft/class.temporary#6
Function::FNV1a::Creator() живет только до конца полного выражения.Дальше же по ходу программы используется мертвая ссылка на него, сохраненная в объекте класса Family (в его Abstract-подобъекте).Это классический случай UB, и поведение всей программы не определено, происходить может что угодно. Добавлено через 5 минут Кроме того, само по себе наличие адреса никак не характеризует, жив у вас объект или нет. Добавлено через 10 минут Однако, как я уже сказал, в вашем случае этой проблемы нет, т.к. shared_ptr сам заботится о назначении правильного deleter`а исходя из переданного в его конструктор типа. Это было бы проблемой, если бы вы использовали unique_ptr, но с shared_ptr - все нормально.
1
|
||||||||||
|
1 / 1 / 0
Регистрация: 08.08.2021
Сообщений: 18
|
||
| 27.10.2021, 15:30 [ТС] | ||
|
Хотел уточнить, относится ли данное исключение, выделенное в подраздел, конкретно к моей проблеме? https://timsong-cpp.github.io/... orary#6.12 Если нет, то что именно? Конечно, если вам не затруднит ответить.
0
|
||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||
| 27.10.2021, 15:49 | ||
|
Если бы у вас не было конструктора у типа, то да, тогда бы и этот пункт стал относиться.
1
|
||
|
147 / 135 / 50
Регистрация: 14.05.2021
Сообщений: 642
|
||
| 27.10.2021, 16:00 | ||
Открываейте багу на компилятор, что я могу сказать. Проблема в нем. Как и у доброй четверти пользователей С++ - виноват компилятор ![]() Добавлено через 2 минуты
0
|
||
|
1 / 1 / 0
Регистрация: 08.08.2021
Сообщений: 18
|
|
| 27.10.2021, 16:55 [ТС] | |
|
Не по теме: Не поймите меня неправильно.
0
|
|
|
147 / 135 / 50
Регистрация: 14.05.2021
Сообщений: 642
|
|||||
| 27.10.2021, 16:59 | |||||
|
Добавлено через 1 минуту
0
|
|||||
| 28.10.2021, 00:29 | |
|
0
|
|
| 28.10.2021, 00:29 | |
|
Помогаю со студенческими работами здесь
15
Создание экземпляра класса-наследника для переменной с типом базового класса Явное создание экземпляра класса и явная специализация шаблона класса Создание экземпляра класса, имя класса находиться в строковой переменной
Как можно изменить атрибут экземпляра одного класса при добавлении/изменении экземпляра другого класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во
всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
|