[C++] usuwanie tablic dynamicznych ( klasa )

0

Witam, mam problem podczas deklaracji dynamicznej tablicy. Otoz, nie wiem jak program moglby sprawdzac, czy tablica zostala utworzona czy nie. Destruktor usuwa tablice nawet gdy jej nie tworze i wtedy pojawia sie blad. Czy moglby ktos napisac jak sprawdzic czy tablica zostala utworzona ( zarowno dla tablicy typu int oraz char ) ? Oto fragment mojego kodu:

class klasa {
	int numerek1;
	int numerek2;
	int *tab;
	char *napis;
public:
	klasa ( int, int );
	klasa ( char * );
	klasa ( int, int, char * );
	klasa ( klasa & );
	~klasa();
	klasa & operator = ( const klasa & );
	klasa operator + ( klasa & );
	klasa operator * ( klasa & );
	klasa operator - ( klasa & );
	void wypisz ();
	void wypisztab();
	friend int zaprzyjazniona ( klasa & );
	friend ostream & operator << ( ostream &, klasa & );
	friend istream & operator >> ( istream &, klasa & );
};

klasa::~klasa() {
    delete[] napis;
    delete[] tab;
}

klasa::klasa ( int a, int b, char *c ){						// konsturktor
            delete[] napis;		
	napis=new char [strlen(c)+1];
	strcpy(napis, c);
	numerek1=a;
	numerek2=b;
}

klasa :: klasa ( klasa & n ){							// knstruktor kopiujacy
	 delete[] napis;
	napis = new char [strlen(n.napis)+1];
	numerek1=n.numerek1;
	numerek2=n.numerek2;
}

klasa & klasa::operator = ( const klasa & m ){
	delete[] napis;							
	napis = new char [strlen(m.napis)+1];
	strcpy(napis, m.napis);
	numerek1=m.numerek1;
	numerek2=m.numerek2;
	cout << "operator przypisania\n";
	return *this;
}

pozdrawiam

0
  1. Z jakiej racji masz jakieś delete[] w konstruktorze?! Przecież w konstruktorze na 100% nic nie jest jeszcze zaalokowane! MYŚL!

A wracając do tematu: albo za pomocą wyjątków, tzn

try
{
   napis=new char [strlen(c)+1];
}
catch(std::bad_alloc)
{
//nie udała się alokacja tablicy i coś z tym robisz, np. ustawiasz napis=NULL i wyświetlasz komunikat
}

Albo używasz new[] w wersji nothrow (nie rzucającej wyjątku) i wtedy jeśli alokacja sie nie uda to masz we wskaźniku NULL. Wtedy w destruktorze wystarczy

if(napis)
  delete[] napis;
if(tab)
  delete[] tab;
0

Ładnie tak łapać wyjątki przez WARTOŚĆ?

0

co to jest to delete[] napis; w konstruktorach?
To ci się pewnie wywala, bo w tych miejscach napis ma nieustaloną wartość (jakieś śmieci z pamięci), więc wykonujesz próbę zwolnienia losowego fragmentu pamięci.

0
Shalom napisał(a)
  1. Z jakiej racji masz jakieś delete[] w konstruktorze?! Przecież w konstruktorze na 100% nic nie jest jeszcze zaalokowane! MYŚL!

Jakiś czas temu czytałem gdzieś w C++ FAQ Lite (http://klub.chip.pl/b.krzemien/c++-faq-pl/index.html), że zwolnienie operatorem delete niezaalokowanej pamięci jest bezpieczne. Nie pamiętam tylko, czy autor tej tezy inicjował wcześniej wskaźnik wartością NULL. Czy ktoś mógłby mnie oświecić jak jest naprawdę?

0

Absolutnie nie używa się delete ani delete[] na niezaalokowanych wskaźnikach! O czym sam się przekonałeś w swoim nie działajacym programie.

0

To jest dozwolone tylko w jednym wypadku, gdy wskaźnik ma ustaloną wartość na NULL.
W takim wypadku delete nie robi nic.
Z tego powodu też, by zapobiec potencjalnym błędom, w programach można zobaczyć kombinację:

delete wskaznik;
wskaznik = 0;

W ten sposób ponowne wywołanie delete na tym wskaźniku nie tym wskaźniku nie spowoduje efektów ubocznych, jak również ponowne użycie tego wskaźnika w innym kontekście spowoduje odpowiedni błąd.

Jednak w twoim przypadku jest to zbędne i głupie.

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