Среда разработки MSVC++ 7.1, ОС WinXP и Win2000. MFC не используется, именования классов с Cxxx — всего лишь дань сложившейся традиции в проекте.
Проблема:
при выполнении метода CTable::Add() на 4-й итерации возникает исключение защиты памяти, либо "зависание" приложения. В том случае, если исключение защиты памяти не возникает и не зависает (всего итераций — около 6000), то возникает AV при попытке удаления динамического объекта CTable:
delete m_pMap; // <===== здесь AV
m_pMap = NULL;
Объект-владелец гарантированно "живой", указываемый объект гарантированно удаляется только в одном (именно этом, проверено поиском по всем файлам проекта) месте.
Проект был портирован в MSVC7 из "шестерки", в ней более 3-х лет работало все у заказчиков "на ура!". После перехода на "семерку" — граблей я не ожидал, но — отладка выявила такую неприятность. Где я не прав? Кто-нибудь сможет выпрямить мне руки?
V_S>Среда разработки MSVC++ 7.1, ОС WinXP и Win2000. MFC не используется, именования классов с Cxxx — всего лишь дань сложившейся традиции в проекте. V_S>Проблема: V_S>при выполнении метода CTable::Add() на 4-й итерации возникает исключение защиты памяти, либо "зависание" приложения. В том случае, если исключение защиты памяти не возникает и не зависает (всего итераций — около 6000), то возникает AV при попытке удаления динамического объекта CTable: V_S>
V_S> delete m_pMap; // <===== здесь AV
V_S> m_pMap = NULL;
V_S>
V_S>Объект-владелец гарантированно "живой", указываемый объект гарантированно удаляется только в одном (именно этом, проверено поиском по всем файлам проекта) месте.
V_S>Проект был портирован в MSVC7 из "шестерки", в ней более 3-х лет работало все у заказчиков "на ура!". После перехода на "семерку" — граблей я не ожидал, но — отладка выявила такую неприятность. Где я не прав? Кто-нибудь сможет выпрямить мне руки?
Я сталкивался с такими же точно симптомами при портировании кода из 6-й студии в 7-ю. У меня причина оказалась в том, что в код попали 2 модуля с разными настройками выравнивания структур. Не знаю, то же самое или нет в Вашем случае. Такое может быть только если Вы прилинковываете статические lib'ы, или у Вас различные файлы в проекте имеют различные настройки компиляции. Если это так, то попробуйте все определения структур, использующихся в map'е обернуть #pragma pack(push,1) и #pragma pack(pop), и посмотреть, все ли файлы компилируются с одинаковыми настройками.
Ни одного указателя в CItem нет, два поля — std::string, остальные — POD (int, DWORD, __int64). Ужели я б об указателях не подумал бы в первую очередь?
Re[4]: Проблема с std::map - Access Violation
От:
Аноним
Дата:
25.01.05 10:00
Оценка:
Здравствуйте, Vlad_SP, Вы писали:
V_S>Ни одного указателя в CItem нет, два поля — std::string, остальные — POD (int, DWORD, __int64). Ужели я б об указателях не подумал бы в первую очередь?
В общем надо врубать всю диагностику и искать проблему в другом месте.
Если есть BoundsChecker, то стоит прогнать програму под ним.
Здравствуйте, Vlad_SP, Вы писали:
V_S>...Ужели я б об указателях не подумал бы в первую очередь?
Кто знает, кто знает...
По существу: данных не хватает. Поэтому гадать можно долго, но толку от этого может не быть вовсе
Так что пробуй состряпать пример, который бы твою проблему наглядно изображал, и давай его сюда. Скорее всего в процессе создания такого примера ты сам этот баг и найдешь.
ЗЫ
На всякий случай спрошу: не используются ли тут dll?
Спасибо Dirichlet'у. Именно уловка с #pragma pack() — #pragma pop() помогла, причем более никаких модификаций в исходник не вносилось. Вопрос закрыт, всем, кто проявил интерес и попытался помочь — также спасибо.