1 / 1 / 0
Регистрация: 22.07.2014
Сообщений: 8
|
||||||||||||||||
Оператор "delete" и ошибка "_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) Error"22.07.2014, 22:14. Показов 5779. Ответов 9
Метки нет Все метки)
(
Здравствуйте. Возникла проблема с оператором "delete". Пользуюсь VisualStudio 2010. Программа компилируется нормально. Все отрабатывает. Когда дело доходит до освобождения памяти, выделенной операцией "new", вылетает ошибка "_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)". Если закомментировать вызов "delete" - программа доходит до логического завершения. Очевидно, какая-то проблема с освобождением памяти. Если я выделяю память только на базовые объекты, "delete" нормально отрабатывает. Но при выделении памяти на любой унаследованный объект - вылетает вышеупомянутая ошибка. Похожая программа из книги по "С++", судя по словам автора книги, работает исправно. Вот код моей программы:
1) Заголовочный файл:
![]()
0
|
22.07.2014, 22:14 | |
Ответы с готовыми решениями:
9
При вызове delete[] _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) Ошибка pHead->nBlockUse
|
Ушел с форума
![]() ![]() |
|||||
22.07.2014, 23:24 | |||||
0
|
Ушел с форума
![]() ![]() |
||||||
22.07.2014, 23:40 | ||||||
IIARTEMII, какой плохой компилятор этот Microsoft Visual C++ !
А между тем, полиморфное удаление объекта без виртуального деструктора - UB.
1
|
20 / 20 / 3
Регистрация: 14.06.2012
Сообщений: 95
|
||||||
22.07.2014, 23:50 | ||||||
Это всё понятно
Теперь у меня вопрос, чтобы не создавать новую тему: Что это за механизм такой, который реагирует на отсутствие виртуального деструктора, если по сути это приводит к утечке памяти, а не к программной ошибке (да, UB может привести к ошибке, а может и нет, но...)? Почему этот механизм себя проявляет только в MSVS? В других продуктах такого никогда не видел Ведь если у нас есть базовый класс, есть унаследованный от него дочерний:
Если схематично представить память, то: |- - - - Base - - - -| - - Der - - | при подходе выше, у нас будет: | - - - - - - - - - - | - - Der - - | Почему тут ошибка? Или тут немножко всё не так?
0
|
Ушел с форума
![]() ![]() |
||||||||||||||||||||||||||||||
23.07.2014, 01:53 | ||||||||||||||||||||||||||||||
виртуальные таблицы в данном конкретном компиляторе и как устроен его аллокатор памяти. Приключения начинаются вот в этой строке:
включая деструктор, то при касте указателя Der к Base его скалярное значение сохранится. То есть, к примеру, если "new Der" вернет адрес 0xABCDE8, то и в ptr будет записано 0xABCDE8. В этом случае, когда будет вызван "delete ptr", аллокатор получит все тот же адрес и сможет корректно освободить занимаемую объектом Der память. Хотя деструктор Der вызван не будет. Предположим, Der унаследован не только от Base, но еще и от Megabase, причем Megabase в списке наследования расположен раньше Base:
изменению его скалярного значения. Пример:
освобождения памяти по адресу 0x985043c, хотя при создании объекта Der был возвращен адрес 0x9850438. Это равноценно тому, что в delete передали адрес, который никогда не выделялся. Кстати, возникновение ошибки в данном примере характерно не только для MS Visual C++, можете проверить на любом компиляторе, который есть под рукой. Нечто похожее происходит и при виртуальном наследовании, так как там "раскладка" классов в памяти заметно отличается от обычной, хотя все это, повторюсь, очень compiler-specific:
При обычном (невиртуальном) наследовании все было бы наоборот. И последний пример, снова с изменением скалярного значения указателя при касте к базовому классу:
деструктор, аллокатор всегда получает "правильный" адрес памяти для очистки, так что проблем, описанных выше, не возникает.
2
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
||
23.07.2014, 04:32 | ||
Механизм этот называется MS CRT Debug Library. При правильном применении очень полезный мехнизм, в том числе и для обнаружения утечек памяти. http://msdn.microsoft.com/en-u... tc9t1.aspx http://msdn.microsoft.com/en-u... 80%29.aspx
0
|
23.07.2014, 04:32 | |
Помогаю со студенческими работами здесь
10
При вызове деструктора выдается ошибка _BLOCK_TYPE_IS_VALID (pHead->nBlockUse) При вызове деструктора вылазит ошибка _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) Ошибка при запуске программы. _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) При освобождении памяти от указателей на массивы вылетает ошибка: _BLOCK_TYPE_IS_VALID(phead->nBlockUse) phead->nblockuse Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
![]() |
||||
Генерация OpenQASM из кода Q#
EggHead 10.07.2025
Летом 2024-го я начал эксперименты с библиотекой Q# Bridge, и знаете что? Она оказалась просто находкой для тех, кто работает на стыке разных квантовых экосистем. Основная фишка этой библиотеки -. . .
|
Изучаем новый шаблон ИИ-чата .NET AI Chat Web App
stackOverflow 10.07.2025
В . NET появилось интересное обновление - новый шаблон ИИ-чата под названием . NET AI Chat Web App. Когда я впервые наткнулся на анонс этого шаблона, то сразу понял, что Microsoft наконец-то. . .
|
Результаты исследования от команды ARP (июль 2025 г.)
Programma_Boinc 10.07.2025
Результаты исследования от команды ARP (июль 2025 г. )
Африканский проект по дождям (ARP) World Community Grid снова запущен! Мы рады поделиться обновленной информацией о нашем прогрессе с осени. . .
|
Angular vs Svelte - что лучше?
Reangularity 09.07.2025
Сегодня рынок разделился на несколько четких категорий: тяжеловесы корпоративного уровня (Angular), гибкие универсалы (React), прогрессивные решения (Vue) и новая волна компилируемых фреймворков. . .
|
Code First и Database First в Entity Framework
UnmanagedCoder 09.07.2025
Entity Framework дает нам свободу выбора, предлагая как Code First, так и Database First подходы. Но эта свобода порождает вечный вопрос — какой подход выбрать?
Entity Framework — это. . .
|
Как использовать Bluetooth-модуль HC-05 с Arduino
Wired 08.07.2025
Bluetooth - это технология, созданная чтобы заменить кабельные соединения. Обычно ее используют для связи небольших устройств: мобильных телефонов, ноутбуков, наушников и т. д. Работает она на частоте. . .
|
Руководство по структурам данных Python
AI_Generated 08.07.2025
Я отчетливо помню свои первые серьезные проекты на Python - я писал код, он работал, заказчики были относительно довольны. Но однажды мой наставник, взглянув на мою реализацию поиска по огромному. . .
|
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах
Programma_Boinc 08.07.2025
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах
Опубликовано: 07. 07. 2025
Рубрика: Uncategorized
Автор: AlexA
Статья размещается на сайте с разрешения. . .
|
Раскрываем внутренние механики Android с помощью контекста и манифеста
mobDevWorks 07.07.2025
Каждый Android-разработчик сталкивается с Context и манифестом буквально в первый день работы. Но много ли мы задумываемся о том, что скрывается за этими обыденными элементами? Я, честно говоря,. . .
|
API на базе FastAPI с Python за пару минут
AI_Generated 07.07.2025
FastAPI - это относительно молодой фреймворк для создания веб-API, который за короткое время заработал бешеную популярность в Python-сообществе. И не зря. Я помню, как впервые запустил приложение на. . .
|