Bad Ptr - usuwanie tablicy znakow

0

Witam

Nie potrafię zrozumieć, dlaczego program się wysypuje podczas usuwania tablicy znaków.

	CRot13 szyfr;
	szyfr.ChangeAlphabet(v);

ClassicCrypt.cpp

CAlphabet::CAlphabet()
{
	size = 0;
	sign = NULL; 
}
CAlphabet::CAlphabet(unsigned sz)
{
	size = sz;
	cout << "Konstruktor wywolany z parametrem" << size << endl;
	sign = new char[sz]; 
	for(int i = 0; i < size; i++)
		sign[i] = 'a';
}
CAlphabet::CAlphabet(const CAlphabet& ca)
{
	size = ca.size;
	sign = ca.sign;
}
CAlphabet::~CAlphabet()
{
	delete []sign;
}
void CAlphabet::ChangeSize(unsigned sz)
{
	delete []sign;                                                                  //TU pojawia się problem.
	sign = new char[sz];
	size = sz;
}
int CAlphabet::GiveSize()
{
	return size;
}
void CAlphabet::Fill(const vector<char>& v)
{
	for(int i = 0; i < v.size(); i++)
		sign[i] = v[i];
}
void CAlphabet::ChangeAlphabet(const vector<char>& v)
{
	ChangeSize(v.size());
	Fill(v);
}
void CAlphabet::Show()
{
	for(int i = 0; i < size; i++)
		cout << i << ". " << sign[i] << endl;
}
void CAlphabet::ChangeElement(int element, char sgn)
{
	sign[element] = sgn;
}

//CCipher-----------------------------------------------------------------------------------

CCipher::CCipher()
{
	plain = new short[0];
	alphabet = new CAlphabet(1);
	textLenght = 0;
}
CCipher::CCipher(string& text, CAlphabet& alph)
{
	*alphabet = alph;
	Convert(text);
}
CCipher::CCipher(const CCipher &ciph)
{
	plain = ciph.plain;
	alphabet = ciph.alphabet;
	textLenght = ciph.textLenght;
}
CCipher::~CCipher()
{
	delete []plain;
}
void CCipher::ChangeAlphabet(const vector<char>& v)
{
	delete alphabet;
	alphabet->ChangeAlphabet(v);
}
0

problem jest tu:

CAlphabet::CAlphabet(const CAlphabet& ca)
{
        size = ca.size;
        sign = ca.sign;
}

Napisałeś naiwny copy construktor (identyczny z domyślnym) i dlatego masz problemy.
Potrzebujesz wyjaśnienia na czym polega problem, czy sam już trybisz :) ?

0

Niestety nie rozumiem.

0

jak tworzysz kopię obiektu (np podczas przekazywania obiektu przez wartość), to oryginał i kopia wskazują na ten sam fragment pamięci (mają jednakowe wskaźniki sign). W momencie, gdy jeden z tych obiektów przestaje istnieć usuwa ten fragment pamięci, a ten drugi ma ustawiony wskaźnik na fragment pamięci, który został już zwolniony. W momencie, gdy ten drugi obiekt ma być zniszczony pojawia ci się błąd, bo próbujesz usunąć coś co już usunął ten pierwszy obiekt zniszczony wcześniej.

0

No teraz rozumiem. Dzięki wielkie :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1