Проблема с std::map - Access Violation
От: Vlad_SP  
Дата: 25.01.05 08:52
Оценка:
Есть код (сокращенно):

class CTable : public map<string, CItem, less<string> > 
{ 
public: 
   BOOL  Add( const CItem& newElement ); 
}; 

//************************* 
BOOL CTable::Add( const CItem& newElement ) 
{ 
   // !!!!!! вот 
   pair<iterator, bool> cp = insert( value_type(newElement.m_code, newElement) ); 
   return cp.second ; 
}

Среда разработки MSVC++ 7.1, ОС WinXP и Win2000. MFC не используется, именования классов с Cxxx — всего лишь дань сложившейся традиции в проекте.
Проблема:
при выполнении метода CTable::Add() на 4-й итерации возникает исключение защиты памяти, либо "зависание" приложения. В том случае, если исключение защиты памяти не возникает и не зависает (всего итераций — около 6000), то возникает AV при попытке удаления динамического объекта CTable:
 
   delete m_pMap;  // <===== здесь AV 
   m_pMap = NULL;

Объект-владелец гарантированно "живой", указываемый объект гарантированно удаляется только в одном (именно этом, проверено поиском по всем файлам проекта) месте.

Проект был портирован в MSVC7 из "шестерки", в ней более 3-х лет работало все у заказчиков "на ура!". После перехода на "семерку" — граблей я не ожидал, но — отладка выявила такую неприятность. Где я не прав? Кто-нибудь сможет выпрямить мне руки?
Re: Проблема с std::map - Access Violation
От: Bell Россия  
Дата: 25.01.05 08:59
Оценка:
Здравствуйте, Vlad_SP, Вы писали:

Покажи конструктор копирования CItem.
Любите книгу — источник знаний (с) М.Горький
Re: Проблема с std::map - Access Violation
От: Dirichlet Россия  
Дата: 25.01.05 09:09
Оценка:
Здравствуйте, Vlad_SP, Вы писали:

V_S>Есть код (сокращенно):


V_S>
V_S>class CTable : public map<string, CItem, less<string> > 
V_S>{ 
V_S>public: 
V_S>   BOOL  Add( const CItem& newElement ); 
V_S>}; 

V_S>//************************* 
V_S>BOOL CTable::Add( const CItem& newElement ) 
V_S>{ 
V_S>   // !!!!!! вот 
V_S>   pair<iterator, bool> cp = insert( value_type(newElement.m_code, newElement) ); 
V_S>   return cp.second ; 
V_S>} 
V_S>

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), и посмотреть, все ли файлы компилируются с одинаковыми настройками.
Re[2]: Проблема с std::map - Access Violation
От: Vlad_SP  
Дата: 25.01.05 09:26
Оценка:
B>Покажи конструктор копирования CItem.

В CItem два поля — std::string, остальные — POD (int, DWORD, __int64), ни одного (гарантированно!) указателя.
Re[2]: Проблема с std::map - Access Violation
От: Lapulya  
Дата: 25.01.05 09:40
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Vlad_SP, Вы писали:


B>Покажи конструктор копирования CItem.


И плюс к конструктору объявление класса CItem, т.е. интересуют инкапсулированные объекты которые присутствуют в классе как указатели.
Re: Проблема с std::map - Access Violation
От: Аноним  
Дата: 25.01.05 09:41
Оценка: +1
Скорей всего проблема в чем-то другом.
Наверное это побочный эффект другого бага.
По крайней мере из того, что ты привел, проблему не видно.
Re[3]: Проблема с std::map - Access Violation
От: Vlad_SP  
Дата: 25.01.05 09:55
Оценка:
Ни одного указателя в 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, то стоит прогнать програму под ним.
Re[4]: Проблема с std::map - Access Violation
От: Bell Россия  
Дата: 25.01.05 10:04
Оценка:
Здравствуйте, Vlad_SP, Вы писали:

V_S>...Ужели я б об указателях не подумал бы в первую очередь?

Кто знает, кто знает...

По существу: данных не хватает. Поэтому гадать можно долго, но толку от этого может не быть вовсе
Так что пробуй состряпать пример, который бы твою проблему наглядно изображал, и давай его сюда. Скорее всего в процессе создания такого примера ты сам этот баг и найдешь.


ЗЫ
На всякий случай спрошу: не используются ли тут dll?
Любите книгу — источник знаний (с) М.Горький
Re[2]: Проблема с std::map - Access Violation
От: Vlad_SP  
Дата: 25.01.05 14:19
Оценка:
Спасибо Dirichlet'у. Именно уловка с #pragma pack() — #pragma pop() помогла, причем более никаких модификаций в исходник не вносилось. Вопрос закрыт, всем, кто проявил интерес и попытался помочь — также спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.