|
1 / 1 / 0
Регистрация: 22.07.2014
Сообщений: 8
|
||||||||||||||||
Оператор "delete" и ошибка "_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) Error"22.07.2014, 22:14. Показов 5996. Ответов 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
|
|
20 / 20 / 3
Регистрация: 14.06.2012
Сообщений: 95
|
|
| 22.07.2014, 22:32 | |
|
Вообще-то всё нормально, это распространённая ошибка MSVS. Где конкретно показывает ошибку, в стандартных файлах? решается переустановкой студии/перезапуском студии/рестарт винды/переход на новую версию студии
0
|
|
|
1 / 1 / 0
Регистрация: 22.07.2014
Сообщений: 8
|
|
| 22.07.2014, 23:00 [ТС] | |
|
Я не совсем понял ваш вопрос. Вот скриншот ошибки:
Возможно он подтолкнет вас на какую-нибудь мысль.
0
|
|
|
Ушел с форума
|
|||||
| 22.07.2014, 23:24 | |||||
|
0
|
|||||
|
20 / 20 / 3
Регистрация: 14.06.2012
Сообщений: 95
|
|||||||
| 22.07.2014, 23:26 | |||||||
0
|
|||||||
|
1 / 1 / 0
Регистрация: 22.07.2014
Сообщений: 8
|
||
| 22.07.2014, 23:38 [ТС] | ||
![]() Добавлено через 5 минут IIARTEMII, вам тоже спасибо за помощь.
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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|