| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Static указатель |
| Автор: Emura 29.4.2010, 15:16 | ||
| Привет всем! Разъясните пожалуйста ситуацию! не пойму где трабл. есть класс в нем статик указатель, чтобы любой объект этого класса мог к нему обратиться. инициализируется как 0. и есть две статик функции ода создает объект по new и запоминает в статик указателе вторая удаляет объект по статик указателю, зануляет его после удаления, как я понимаю, код бунтует по страшному! везде, совершенно рандомно, возникают эксепшены по поводу new\delete. подскажите в чем дело! не пойму где закралась ошибка Спасибо! Вот для наглядности
|
| Автор: Emura 29.4.2010, 15:36 | ||||||
| azesmcar везде это по всему коду, где идет работа с памятью. теперь еще выяснил что только на освобождении.
нет. пока только в free.c (строка 110 и не только)
в том и дело что там не вылетает, а вылетает при освобождении памяти причем в случайных местах по коду где эта память очищается |
| Автор: azesmcar 29.4.2010, 15:50 |
| Emura а как вызываешь? покажи рабочий код, который запускаешь и при удалении вылетает. |
| Автор: Emura 29.4.2010, 16:05 |
| azesmcar код многотысячен что усложняет ситуацию.... попробую конечно сформировать код который вызывает ошибку, но не факт. там слишком много взаимосвязей. |
| Автор: azesmcar 29.4.2010, 16:28 | ||
а как я могу чем-то помочь, если не вижу кода? там может быть что угодно, к примеру в совсем другом участке кода мог попортить что-то, выйти за пределы массива..мало ли что. |
| Автор: Sartorius 29.4.2010, 16:35 |
| show - потенциально опасна (возможна утечка памяти). Проверяй указатель, перед созданием нового объекта. Но это врядли могло привести к падению |
| Автор: Emura 29.4.2010, 17:19 |
| Sartorius, да, в реальном коде там проверки. да и show тоже 1 раз выполняется. |
| Автор: AndreyK 11.5.2010, 13:09 |
| Ошибки при освобождении памяти (по личному опыту) возникают, когда при освобождении запорчена структура памяти освобождаемого куска. Т.е. нормальный кусок памяти выглядит как: FDFDFDFD CDCDCDCDCDCDCD ... FDFDFDFD - это заголовок CDCD ... - это неинициализированное содержание - туда потом записываются данные. Так вот если при освобождении менеджер памяти обнаруживает разрушение заголовка (FDFDFDFD), вот тогда и возникает ошибка памяти. Значит искать её надо так: при первом выделении памяти (которая потом должна запортится) заметить адрес и в режиме дебагера следить за заголовком - в каком месте он будет испорчен. Или поставить точку прерывания на обращение к этому участку памяти (если дебагер позволяет). |