Destruktor - operator delete

0

witam, mam problem z (nie)działającym destruktorem...

oto klasa:

class obrazek{
	private:
		string *obraz;
		int dl;
	public:
		obrazek(){
			obraz=NULL;
		}
		~obrazek(){
			if(obraz){
				delete [] obraz;
			}
		}

		friend istream &operator>>(istream &is, obrazek &wzor){
			cout << "Wprowadz ilosc linijek" << endl;
			is >> wzor.dl;
			wzor.obraz= new string[wzor.dl];
			cout << "Wprowadz obrazek" << endl;
			is.ignore(10,'\n');
			for(int i=0; i<wzor.dl; i++){
				getline(is, wzor.obraz[i]);
			}
			return is;
		}
};

przy wywołaniu:

	obrazek O;
	cin >> O;
	O.~obrazek();

w visual studio 2008 wyskakuje assertion failure...
siedzę nad tym już trochę czasu i dalej nie mogę wykminić gdzie jest błąd a w końcu to tylko parę linijek kodu :o

z góry dzięki za pomoc

0

Ciekawe co rozumiesz przez: "funkcja zaprzyjaźniona" bo to:

friend istream &operator>>(istream &is, obrazek &wzor){
                        cout << "Wprowadz ilosc linijek" << endl;
                        is >> wzor.dl;
                        wzor.obraz= new string[wzor.dl];
                        cout << "Wprowadz obrazek" << endl;
                        is.ignore(10,'\n');
                        for(int i=0; i<wzor.dl; i++){
                                getline(is, wzor.obraz[i]);
                        }
                        return is;
                }

Nazwałbym raczej jako "metoda zaprzyjazniona", funkcje zaprzyjaznione definujemy na zewnatrz klasy !

No i dlaczego musisz wywoływac destruktor jawnie ?? O_o

0

Znajduje się wewnątrz klasy, żeby nie robić burdelu we fragmencie kodu, który tu wysłałem.
Wywołuje konstruktor jawnie, żeby pokazać, że błąd na pewno wyskakuje w trakcie działania destruktora.

0
xmoon napisał(a)

funkcje zaprzyjaznione definujemy na zewnatrz klasy !
Nieprawda, wewnątrz klasy też można.

ppaawweel napisał(a)

Wywołuje konstruktor jawnie, żeby pokazać, że błąd na pewno wyskakuje w trakcie działania destruktora.
Więc destruktor wywoływany jest dwa razy i ciężko, żeby to działało.

0

Nieprawda, wewnątrz klasy też można.

Tak mozna ale mi chodzi o "funkcje" nie metody(funkcje składowe) ja stosuje takie nazewnictwo :)

0
xmoon napisał(a)

Tak mozna ale mi chodzi o "funkcje" nie metody(funkcje składowe) ja stosuje takie nazewnictwo :)
No i też jest to najnormalniejsza funkcja, nie metoda. Sprawdź sam:

#include <cstdio>
using std::printf;

class foo
{
public:
  explicit foo(int val)
    : myVal(val)
  {
  }
  void doSth() const
  {
    printf("%d\n", myVal);
  }
private:
  int myVal;

  friend void omfg(const foo& obj)
  {
    obj.doSth();
  }
};

int main()
{
  foo a(11);
  omfg(a);
}
0

Jednak mozna, moj blad.... :|

0
Fanael napisał(a)

Więc destruktor wywoływany jest dwa razy i ciężko, żeby to działało.

...

obrazek O;
        cin >> O;
        O.~obrazek();
        cout << "DALEJ NIE DZIAŁA";

sypie się DOKŁADNIE w 3 linijce... do 4 nie dochodzi...

0

A u mnie dochodzi.

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