Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> обращение к мемберам класса через указатель, через раз приводит к ран-тайм ошибке 
V
    Опции темы
zkv
Дата 23.8.2006, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



пишу собсвенный хидер содержащий класс вида:
Код

class CMyClass
{
     int m_len;
    CMyClass( int len )
   {
        m_ len = len;
   }
   int GetLen()
   {
        return m_len; //ошибка возникает здесь
   }
};


потом подключив этот хидер пытаюсь произвожу следующие действия:
Код

      CMyClass *pMyClass;
      pMyClass = new CMyClass( 5 );
      cout<<pMyClass->GetLen();

Проект компилируется/линкуется без проблем, но при запуске, примерно в 50% случаев выдает ошибку: 
Unhandled exception at 0x004da816 appl.exe: 0xC0000005: Access violation reading location 0xcdcdcdd3.
в тексте программы место помечено комментарием. Если запускать  ехе-шник, то прога падает тоже в 50% случаев (притом мне кажется что вообще стабильно через раз). Если прогонять через "опасные" места прогу по шагам, то работает всегда правильно. Приложение MFC-based, среда Visual C++ 7.1.  И главное, проект уже большой очень, и если попробовать сгенерировать ошибку в другом (маленьком) проекте, то она не возникает. Делаю вывод, что у меня в проекте что-то не так smile Посмотрел, обращений по пустым указателям типа CMyClass * к  GetLen() нигде нет (но даже если бы и были, то программа падала бы независимо от того по шагам мы её или нет?). 
Внимание вопрос smile : Куда копать, чтоб найти ошибку? Важно ли что приложение MFC? Может какой нибудь макрос типа ASSERT а надо куда-нибудь прикрутить? И как вообще такое может быть что по шагам идет, а по другому нет - глюк среды? 

PS простите если не в тот форум вопрос, просто не знаю, дело в MFC или нет.
PM MAIL   Вверх
Earnest
Дата 23.8.2006, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Поставь отладочную печать (TRACE) внутри GetLen: адрес this и значение m_len.
Такое впечатление, что this левый получается. 
Между созданием объекта и вызовом GetLen есть какой-то код?
Сам по себе код выглядит невинно, скорее всего дело в другом коде.
Можно попробовать поставить точку прерывания на запись по адресу &pMyClass. Я уже не помню, как, но точно можно.
В смысле, искать, кто портит переменную.

Но начни с полного ребилда проекта. Вспомни, не переносил ли ты заголовочные файлы из одной папки в другую. Если да, то вычисти все старые хвосты.


--------------------
...
PM   Вверх
ManiaK
Дата 23.8.2006, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



zkv, точно такой код, как ты показал просто не скомпилируется. Покажи точный код, в котором такие глюки происходят.
PM MAIL WWW   Вверх
MAKCim
Дата 23.8.2006, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

точно такой код, как ты показал просто не скомпилируется

верно


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
zkv
Дата 23.8.2006, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



ManiaK, точно, забыл про public-и. 
совсем точный код не получится, но выше я его хм, несколько упростил, на самом деле система такая (не думал, что это принципиально):
класс в котором проблемы:
Код

class CZOOM 
{
  int wMaxVal;
  //и другие члены
public:
  CZOOM( HANDLE CamHandle )
  {
    MyExternalFunction( CamHandle,  wMaxVal ); //здесь определяется значение wMaxVal
  }
  int GetMax( )
  {
    return wMaxVal;  //тут показывает ошибку
  }
  //другие методы
};


класс в котором член - указатель на предыдущий smile 
Код

class CCam
{
  CZOOM  *pZoom;
  //и другие члены
public:
  CCam()
  {
    //...
    pZoom = NULL;
    //...
  }
  ~CCam()
  {
     //...
     if( pZoom )
       delete pZoom;
     //...
  }
  Init()
  {      
    //...
    pZoom = new CZOOM( m_Handler );
    //...
  }
  CZOOM  *GetZoomPtr()
  {
     return pZoom;
  } 
  //другие методы
};

 
 в классе моего диалога:  
Код

CMyDialog::InitDialog()   //
{
            CDialog::OnInitDialog();
             //.....
            CCam *pCam;
            pCam = new CCam;
            pCam->Init();
            //m_SZoom - control variable слайдера в моем диалоге
            m_SZoom.SetRange( 0, pCam->GetZoomPtr()->GetMax() ); //здесь единственное в проге  
                                                               //обращение к CZOOM::GetMax() 
           //...
}

Earnest спасибо, и все-таки, может ли играть роль то, что приложение MFC? Просто вспоминаю, писал проект (MFC), добавил два файла, такие:
MyClass.h   
Код

//с защитой от двойного инклуда
class MyClass
{
     MyClass();
     ~MyClass();
};

MyClass.cpp
Код

#include "MyClass.h"
MyClass::MyClass()
{
}
MyClass::~MyClass()
{
}

потом подключил хидер MyClass.h к какому то файлу проекта, вдруг вспомнил про какой то недоделанный косяк, бросился доделывать, ну думаю, кому он хидер этот помешает, пустой.
Через несколько запусков линкер стал выдавать что про операторы delete  и delete [] что типа они уже олреди определены, так как у меня эти самые операторы в проекте использовались довольно широко я естественно подумал, что у меня что то не так... Довольно долго я копался в проекте в МСДНе и яндексе,  пока не попробывал отключить этот самый пустой хидер - все заработало, решил посмотреть, получится ли еще раз такую ошибку повторить, получилось, стабильно после добавления файлов такого вида в проект,  линкер через 3-5 запусков начинал точно так же материться, причем номер проходил только с MFC приложениями. Так вот если бы сейчас кто нить спросил, "А что это у меня линкер вот так (см. выше) гонит?", то я бы естественно человеку помог бы.  Вот я и задаю вопрос в надежде, что это глюк как то связанный со средой, MFC, или еще с чем нибудь, а не с моей головой smile
PM MAIL   Вверх
ManiaK
Дата 23.8.2006, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



zkv, внешне так ошибок нет вроде. Попробуй пересобери проект.

MFC язык Си++ не изменяет, потому вроде как ничего не должно быть тут. Можешь ещё попробовать из деструктора CCam убрать delete pZoom. VS очень любит мудрить с операторами delete...
PM MAIL WWW   Вверх
zkv
Дата 23.8.2006, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



вообщем, дело во внешней девайсине и/или в библиотеке к ней,  не знаю пока точно, что происходит, но это вопрос времени. Спасибо за участие. Вопрос закрыт.

ps извините что отвлек не по существу...

Это сообщение отредактировал(а) zkv - 23.8.2006, 14:04
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0744 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.