Wyrzucanie wyjątku

0

Dlaczego catch w tym programie nie przechwytuje wyjątku, a przynajmniej nie wyświetla komunikatu?

#include "stdafx.h"
#include <iostream>
using namespace std;

#pragma warning(disable:4290)

#define DECLARE(x) int* tabx##=new int

const int sizet=20;

class klasa{
public:
	class myException:public bad_alloc{
		klasa* kl;
	public:
		myException(klasa* l1):bad_alloc(),kl(l1){}
		klasa* get(){return kl;}
	};
	void* operator new(size_t size,bool w) throw(bad_alloc){
		int** tab=new int*[sizet];
		for(int i=0;i<12;i++){
			tab[i]=new int;
			if(i==10&&w==true) throw myException(&klasa());
			return tab;
		}
	}
	static void* przydziel(klasa* k,int j){
		k=new(false) klasa;
		return k;
	}
};
		



int _tmain(int argc, _TCHAR* argv[])
{
	try{
	klasa* k=new(true) klasa;
	
	delete k;
	}catch(klasa::myException& b){
		cout<<b.what()<<endl;
		klasa* k=b.get();
		k=new(false) klasa;
	}
	
}
0

Zapewne chodzi Ci o to, żeby

return tab;

było niżej. Ale i tak ten kod nie ma żadnego sensu. Ponoć każdy program coś robi, ale nie każdy robi to, co powinien. Co powinien robić Twój program?

0

Mój program to rozwiązanie zadania z Thinking in c++ Tom 2. Rozdział 1.
Wiem, że program jest bez sensu.
A to dlatego, że za zadanie miałem "udać", że przy alokacji 10 "obiektu"za pomocą operatora new występuje błąd pamięci. Wtedy za pomocą funkcji statycznej mam zwiększyć ilość dostępnej pamięci i wtedy wyjątku ma nie wywalać.
No , ale operator new ma zwrócić jeden wskaźnik więc utworzyłem tablicę wskaźników do obiektów. A żeby operator new wiedział kiedy ma mu zabraknąć pamięci dodałem argument.
myException ma w konstruktorze adres obiektu tymczasowego, bo nie mogłem ze statycznego operatora new wyciągnąć adresu obiektu którego operator new był wykonywany. Więc "na niby" utworzyłem go.
I jako, że tymczasowy to musiałem go przypisać nowemu wskaźnikowi. I dla tego wskaźnika powinienem użyć statycznej funkcji przydziel,ale zapomniałem.

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