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.
Błąd segmentation fault przed zakończeniem programu
- Rejestracja: dni
- Ostatnio: dni
- Postów: 22
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Space: the final frontier
- Postów: 26433
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 22
Ok ja wiem co może być powodem takiego błędu ale nie wiek w którym miejscu go znaleźć by go w eliminować
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Space: the final frontier
- Postów: 26433
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 ;]
- Rejestracja: dni
- Ostatnio: dni
- Postów: 787
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 ...
- Rejestracja: dni
- Ostatnio: dni
- Postów: 22
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).
- Rejestracja: dni
- Ostatnio: dni
- Postów: 787
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;
}
- Rejestracja: dni
- Ostatnio: dni
- Postów: 22
Nie można ich skompilować error: field ‘int a::a’ with same name as class
- Rejestracja: dni
- Ostatnio: dni
- Postów: 22
No dobrze skompilowały się bez problemowo i działają
- Rejestracja: dni
- Ostatnio: dni
- Postów: 22
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