Błąd segmentation fault przed zakończeniem programu

0

Witam.
Tematem tego postu będzie błąd który zauważyłem w moim programie. Dokładnie tym błędem jest Segmentation fault. Dokładnie nie wiem co powoduje ten błąd ale pojawia się on tylko jak wejdę w którąś pozycje w menu i później dam zakończ.
Tu adres do kodu programu. http://code.google.com/p/minidbxml/source/browse/MiniDBXML-0.0.6/r3/Po zdebugowaniu programu daje on informacje że błąd może być w 58 linijce w pliku security.h ale ja tam błędu nie widzę. Czy ktoś mógłby mi pomóc zdiagnozować gdzie jest ten błąd.

1

Segfault = błąd naruszenia ochrony pamięci. Skąd się bierze? Stąd że piszesz po cudzej pamięci, albo zwalniasz tą samą pamięć wielokrotnie etc. Rzuciłem okiem na kod i powiem jedno: za bardzo kombinujesz. Po co wszystko próbujesz na siłę upchać na stercie? Wskaźniki do intów, stringów, zmiennych tymczasowych? Aż tak ci żal tych kilku bajtów na stosie? To się nie ma co dziwić że masz teraz problemy.

0

Ok ja wiem co może być powodem takiego błędu ale nie wiek w którym miejscu go znaleźć by go w eliminować

0

Gdybys pisał to jak normalny człowiek, to dynamiczną alokację pamięci wskaźniki miałbyś tylko w kilku miejscach i byłoby to dość proste do odszukania. A w takim przypadku życzę powodzenia i miłych sesji z debuggerem ;]

1
sylwek3100 napisał(a)

Czy ktoś mógłby mi pomóc zdiagnozować gdzie jest ten błąd.

No .

delete name_tag_,mem,name_tag,id,file;

Co Ci to przyszło do głowy , przy takim zapisie nie masz żadnej gwarancji jak zachowa się kompilator .
Prawdopodobnie program nie zwolni prawidłowo pamięci ...

0
dzejo napisał(a)
sylwek3100 napisał(a)

Czy ktoś mógłby mi pomóc zdiagnozować gdzie jest ten błąd.

No .

delete name_tag_,mem,name_tag,id,file;

Co Ci to przyszło do głowy , przy takim zapisie nie masz żadnej gwarancji jak zachowa się kompilator .
Prawdopodobnie program nie zwolni prawidłowo pamięci ...

Ale po usunięciu tego zapisu dalej jest błąd(właściwie ten zapis był od wcześniejszy wersji i jakoś nie sprawiał problemu).

1

To skompiluj taki program :

#include <iostream>
using namespace std ;

//---------------------------------------------------------------------------
class a{
         int b ;
         public :
         a(int c)
         {
            b = c;
         }
         ~a()
         {
             cout << "destruktor" << b << endl ;
         }
       };
//-------------------------------------------------------------------------------
void proc(void)
{
   a*wsk1 = new a(4);
   a*wsk2 = new a(5);
   a*wsk3 = new a(6);
   cin.get();
   cout << "niszczenie" << endl ;
   delete wsk1,wsk2,wsk3;

}
#pragma argsused
int main(int argc, char* argv[])
{
   a*wsk1 = new a(1);
   a*wsk2 = new a(2);
   a*wsk3 = new a(3);
   cout << "niszczenie" << endl ;
   delete wsk1,wsk2,wsk3;

   cin.sync();
   cin.get();

   proc();

   cin.sync();
   cin.get();


        return 0;
}

i taki :

#include <iostream>
using namespace std ;

//---------------------------------------------------------------------------
class a{
         int b ;
         public :
         a(int c)
         {
            b = c;
         }
         ~a()
         {
             cout << "destruktor" << b << endl ;
         }
       };
//-------------------------------------------------------------------------------
void proc(void)
{
   a*wsk1 = new a(4);
   a*wsk2 = new a(5);
   a*wsk3 = new a(6);
   cin.get();
   cout << "niszczenie" << endl ;
   delete wsk1;
   delete wsk2;
   delete wsk3;

}
#pragma argsused
int main(int argc, char* argv[])
{
   a*wsk1 = new a(1);
   a*wsk2 = new a(2);
   a*wsk3 = new a(3);
   cout << "niszczenie" << endl ;
   delete wsk1;
   delete wsk2;
   delete wsk3;

   cin.sync();
   cin.get();

   proc();

   cin.sync();
   cin.get();


        return 0;
}
0

Nie można ich skompilować error: field ‘int a::a’ with same name as class

0

No dobrze skompilowały się bez problemowo i działają

0

Pierwszy program

 niszczenie
destruktor1


niszczenie
destruktor4

Drugi :

 niszczenie
destruktor1
destruktor2
destruktor3


niszczenie
destruktor4
destruktor5
destruktor6

Edit: Odkryłem błąd. Powodowała to zmienna counter która musi być wyzerowania przy starcie bo daje bardzo dziwne wartości które źle wpływały na tablice z sesjami. Dzięki wszystkim za pomoc

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.