Witam
Przetrząsnąłem pół internetu szukając odp na mój problem, ale niestety nigdzie nie znalazłem nic użytecznego. Robię projekt z bibliotek STL i umyśliłem sobie zrobić program symulujący bazę danych biblioteki. Mam taki kod głównej klasy programu:
class CBibl
{
static CBibl * bib;
vector < COsoba *> uzytkownicy;
vector < CKsiazka *> ksiazki;
CBibl();
public:
static CBibl * start();
void dodajks( CKsiazka * );
void dodajos( COsoba * );
//(...)
}
kod klasy COsoba:
class COsoba
{
string imie;
string nazwisko;
CKsiazka * ks[ limit ];
public:
COsoba( string a, string b )
: imie( a )
, nazwisko( b )
{ ks[ 0 ] = 0; }
//(...)
}
Problem polega na tym, że próbując dodać nowy wskaźnik do vectora poprzez metodę:
void CBibl::dodajos( COsoba * a )
{
uzytkownicy.push_back( a );
}
Wywoływaną w sposób:
dodajos( new COsoba( a, b ) )
Program wyrzuca błąd "Unhandled exception at 0x00fe7c99 in stl.exe: 0xC0000005: Access violation reading location 0x0000001c." Nie rozumiem, jak w tak prostym tworze jak vector wskaźników występować błędy pamięci. W żaden sposób nie próbuję się odwołać do miejsc na które wskazują przechowywane wskaźniki więc nawet jeśli błędy byłyby w samych obiektach to chyba nie powinno mieć żadnego znaczenia, jako, że przechowywane są w zupełnie innym miejscu pamięci? Nie ma znaczenia czy dodaję obiekt klasy CKsiazka, czy COsoba. Próbowałem nawet zmienić vector na vector obiektów - to także nie uczyniło żadnej różnicy. Obiekty tworzone i przekazywane do funkcji są poprawnie.
Po wysypaniu programu Visual kieruje mnie do funkcji z vector.h:
bool _Inside(const _Ty *_Ptr) const
{ // test if _Ptr points inside vector
return (_Ptr < this->_Mylast && this->_Myfirst <= _Ptr);
}