Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Access violation при удалении датамодуля... / 17 сообщений из 17, страница 1 из 1
18.07.2007, 14:11
    #34667157
bigfox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation при удалении датамодуля...
Не могу понять где собака порылась. Есть датамодуль (dmPub) в отдельном bpl. Есть два приложения в которых подключен данный bpl . В обоих приложениях при создании главной формы происходит следующее:

Код: plaintext
1.
2.
3.
4.
5.
void __fastcall TfrmMain::FormCreate(TObject *Sender)
{
 dmPub = new TdmPub(this);
...
}

В первом приложении при его закрытии и соответсвенно удалении dmPub все проходит нормально.
Во втором получаю ошибку (причем никаких дополнительных действий не происходит, просто запуск приложения и тут же его закрываем, для чистоты эксперемента так сказать):

Error 00001. 0x400004 (Thread 0x0E34):
Exception 0xC0000005: Access violation at 0xEFEFF037.
Call Tree:
0x7C901010(=ntdll.dll:0x01:000010)
0x004F51B3(=CrystalWaiter.exe:0x01:0F41B3)
0x004AA4D1(=CrystalWaiter.exe:0x01:0A94D1)
0x0050911C(=CrystalWaiter.exe:0x01:10811C)
0x005090AC(=CrystalWaiter.exe:0x01:1080AC)
0x00409945(=CrystalWaiter.exe:0x01:008945) c:\program files\borland\cbuilder6\include\vcl\Forms.hpp#936

The bogus value (0xEEEEEEEE) was most likely retrieved by accessing a freed
heap area
------------------------------------------

Все действия в обоих приложения одинаковы, никак не могу понят откуда он берет этот адрес и вообще что происходит.

Может есть у кого какие мыслишки, буду рад услышать.

дебагер останавливается при этом тут:
/* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { } в Forms.hpp#936
...
Рейтинг: 0 / 0
18.07.2007, 14:39
    #34667309
bigfox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation при удалении датамодуля...
Сделал еще интереснее:

Код: plaintext
1.
2.
3.
4.
5.
void __fastcall TfrmWaiter::FormCreate(TObject *Sender)
{
 dmPub = new TdmPub(this);
 delete dmPub;
}

Все проходит успешно, но как только закрываю форму происходит вышеизложенная ошибка. Такое ощущение что приложение пытается повторно свободить выделенную память... Получается, что когда должен выполниться деструктор формы самой формы уже нет в памяти чтоли, мля ниче понять не могу
...
Рейтинг: 0 / 0
18.07.2007, 15:23
    #34667533
TDataModule
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation при удалении датамодуля...
bigfoxСделал еще интереснее:

Код: plaintext
1.
2.
3.
4.
5.
void __fastcall TfrmWaiter::FormCreate(TObject *Sender)
{
 dmPub = new TdmPub(this);
 delete dmPub;
}

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

Код: plaintext
1.
2.
3.
4.
5.
void __fastcall TfrmWaiter::FormCreate(TObject *Sender)
{
 dmPub = new TdmPub( 0 );
 delete dmPub;
}
или так:
...
Рейтинг: 0 / 0
18.07.2007, 15:25
    #34667544
TDataModule
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation при удалении датамодуля...
продолжение следует
Код: plaintext
1.
2.
3.
4.
void __fastcall TfrmWaiter::FormCreate(TObject *Sender)
{
 dmPub = new TdmPub(this);
}
У вас frmWaiter является owner'ом dmPub (благодаря this в кострукторе). Owner сам удаляет всех своих Childo'ов, поэтому повторное удаление не нужно.
...
Рейтинг: 0 / 0
18.07.2007, 15:43
    #34667645
bigfox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation при удалении датамодуля...
TDataModule
А так:

Код: plaintext
1.
2.
3.
4.
5.
void __fastcall TfrmWaiter::FormCreate(TObject *Sender)
{
 dmPub = new TdmPub( 0 );
 delete dmPub;
}


А так тоже самое. Более того ваш пример ни о чем не говорит. Ошибки не будет в таком случае только если убрать delete dmPub. Т.е. при закрытии приложения память выделенная под dmPub не будет высвобождаться (ну или она каким-то чудодейственым способом все-таки освобождается). Сложилось впечатление, что при закрытии приложения dmPub освобождается в любом случае, т.е. как будто датамодуль был создан автоматически. если чесно я запутался что куда освобождается.

Сейчас сижу удаляю с формы все компоненты и потихоньку проверяю. Есть подозрения, что все это связанно с каким-то компонентом на форме.


автор
продолжение следует


void __fastcall TfrmWaiter::FormCreate(TObject *Sender)
{
dmPub = new TdmPub(this);
}
У вас frmWaiter является owner'ом dmPub (благодаря this в кострукторе). Owner сам удаляет всех своих Childo'ов, поэтому повторное удаление не нужно.



Я в курсе, что frmWaiter является owner'ом dmPub. В том то и дело, не зависимо кто и как что удаляет. Я специально удалил заранее экземпляр dmPub во втором примере. Ошибка происходит в деструкторе /* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { } в Forms.hpp#936
...
Рейтинг: 0 / 0
18.07.2007, 15:51
    #34667679
bigfox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation при удалении датамодуля...
Методом научного тыка выяснилось, что на форме находится TSIBfibEventAlerter и ошибка связанна с ним. Если зарегесртировать события алертера, то при закрытии приложения произойдет такая вот кака. Не пойму только теперь из-за чего все таки это происходит. Не раз пользовался ранне этими алертерами и все ок. а тут на тебе
...
Рейтинг: 0 / 0
18.07.2007, 15:56
    #34667707
TDataModule
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation при удалении датамодуля...
bigfoxОшибка происходит в деструкторе /* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { } в Forms.hpp#936
Это либо лишний вызов деструктора (The bogus value (0xEEEEEEEE) was most likely retrieved by accessing a freed heap area ), либо исключение в самом деструкторе.

Проверьте, сколько раз вызывается деструктор датамодуля.
...
Рейтинг: 0 / 0
18.07.2007, 15:58
    #34667721
TSIBfibEventAlerter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation при удалении датамодуля...
bigfoxМетодом научного тыка выяснилось, что на форме находится TSIBfibEventAlerter и ошибка связанна с ним. Если зарегесртировать события алертера, то при закрытии приложения произойдет такая вот кака. Не пойму только теперь из-за чего все таки это происходит. Не раз пользовался ранне этими алертерами и все ок. а тут на тебе
Не знаю, кто такой, но раз умеет регистрировать события, то должон уметь и корректно дерегистрировать. Раньше вам просто везло :)
...
Рейтинг: 0 / 0
18.07.2007, 16:06
    #34667764
bigfox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation при удалении датамодуля...
Деструктор вызывается 1 раз. После выполнения DataModuleDestroy дебагер показывает на строку:
в модуле systobj.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
...
       template <class T> class RTL_DELPHIRETURN DelphiInterface
        {
        private:
          T       *intf;

          /* This is a temp hack to allow the C++ compiler to allow us to derrive
                 from DelphiInterface even though we're not implementing and methods
           */
  //    virtual void __InternalPureHack() = 0;

        public:
          __fastcall DelphiInterface<T>() : intf( 0 )
->>    {}   // вот тут то и наступет ошибка 

...
Рейтинг: 0 / 0
18.07.2007, 16:11
    #34667787
bigfox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation при удалении датамодуля...
TSIBfibEventAlerter bigfoxМетодом научного тыка выяснилось, что на форме находится TSIBfibEventAlerter и ошибка связанна с ним. Если зарегесртировать события алертера, то при закрытии приложения произойдет такая вот кака. Не пойму только теперь из-за чего все таки это происходит. Не раз пользовался ранне этими алертерами и все ок. а тут на тебе
Не знаю, кто такой, но раз умеет регистрировать события, то должон уметь и корректно дерегистрировать. Раньше вам просто везло :)

Тут вообще интересная история. Естественно я их корректно и дерегистрирую. До этого поста я делал следующее: создал новый проект, подключил все что нужно, проверил - работает. Начал переносить компоненты с формы проекта с ошибкой на новую работающую форму. И как только я создал там алертер начал появляться глюк. Удалил алертер - глюк исчез. Я решил что в нем проблема и запостил на форум. Открыл багнутый проект и удалил там алертер, однако ошибка не исчезла.... что за ...
...
Рейтинг: 0 / 0
18.07.2007, 16:14
    #34667799
TSIBfibEventAlerter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation при удалении датамодуля...
bigfoxДеструктор вызывается 1 раз. После выполнения DataModuleDestroy дебагер показывает на строку:
в модуле systobj.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
...
       template <class T> class RTL_DELPHIRETURN DelphiInterface
        {
        private:
          T       *intf;

          /* This is a temp hack to allow the C++ compiler to allow us to derrive
                 from DelphiInterface even though we're not implementing and methods
           */
  //    virtual void __InternalPureHack() = 0;

        public:
          __fastcall DelphiInterface<T>() : intf( 0 )
->>    {}   // вот тут то и наступет ошибка 

По поводу FIB'ов вам лучше спросить непосредственно у разработчиков или у людей, активно использующих эту библиотеку:
тут: http://www.sql.ru/forum/actualtopics.aspx?bid=2
или тут: http://ibase.ru/

Скорее всего нужно корректно завершить работу алертера...
...
Рейтинг: 0 / 0
18.07.2007, 16:27
    #34667848
Use debug DCU
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation при удалении датамодуля...
bigfoxТут вообще интересная история. Естественно я их корректно и дерегистрирую. До этого поста я делал следующее: создал новый проект, подключил все что нужно, проверил - работает. Начал переносить компоненты с формы проекта с ошибкой на новую работающую форму. И как только я создал там алертер начал появляться глюк. Удалил алертер - глюк исчез. Я решил что в нем проблема и запостил на форум. Открыл багнутый проект и удалил там алертер, однако ошибка не исчезла.... что за ...
Чудес не бывает... Попробуйте поставить "Use debug DCU" в свойствах проекта и "прогуляться" по исходникам в поисках мины.

P.S. Методы научного тыка и копипаста к добру не приводят... :)
...
Рейтинг: 0 / 0
18.07.2007, 16:42
    #34667912
bigfox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation при удалении датамодуля...
Use debug DCU

P.S. Методы научного тыка и копипаста к добру не приводят... :)

угу совершенно согласен, не первый раз натыкаюсь на порблему именно по этому поводу. Спасибо за совет.
...
Рейтинг: 0 / 0
18.07.2007, 17:00
    #34667993
bigfox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation при удалении датамодуля...
Вобщем все таки однозначно можно сказать, что пока у алертера не установленно свойство database (т.е. он не используется) все работате корректно, иначе - ошибка.

Для начала просто откажусь от его использования...
...
Рейтинг: 0 / 0
18.07.2007, 17:05
    #34668017
Guillotine
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation при удалении датамодуля...
bigfoxВобщем все таки однозначно можно сказать, что пока у алертера не установленно свойство database (т.е. он не используется) все работате корректно, иначе - ошибка.

Для начала просто откажусь от его использования...
Гильотина, конечно, надёжное средство, но излишне радикальное.
Попробуйте для начала задать вопрос по вышеприведённым адресам.
...
Рейтинг: 0 / 0
18.07.2007, 17:15
    #34668044
bigfox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation при удалении датамодуля...
Вопрос задам. Но все равно нужно отказываться, хотя бы от использования его в целях обновления наборов данных по событию (тут некоторые в соседних топах серпом по ... за такое обещали :Р), так что пора завязывать.....
...
Рейтинг: 0 / 0
18.07.2007, 17:44
    #34668145
Refresh.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation при удалении датамодуля...
bigfoxВопрос задам. Но все равно нужно отказываться, хотя бы от использования его в целях обновления наборов данных по событию (тут некоторые в соседних топах серпом по ... за такое обещали :Р), так что пора завязывать.....
Солидарен с некоторыми. Кнопка "Обновить" куда лучше.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Access violation при удалении датамодуля... / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]