Показать сообщение отдельно

  #2  
Старый 04.05.2009, 22:47
Ra$cal
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
Провел на форуме:
1354067

Репутация: 599


По умолчанию

короч вот простой пример проблем, порождаемых ленивой работой с указателями

Код:
class A{
public:
	A(){};
	A(int _x1, int _x2, int _x3){
		x1 = _x1;
		x2 = _x2;
		x3 = _x3;
	};
	~A(){};

	void f1 (){
		y = x1 + x2 - x3;
	}

protected:
	int x1, x2, x3;
	int y;
};

class B{
public:
	B(int _x1, int _x2, int _x3){
		a = new A(_x1, _x2, _x3);
	};
	~B(){
		delete a;
	}
	
	void f1(){
		a->f1();
	}
protected:
	A* a;
};

int main(void)
{

	B* b;
	b = new B(45, 5, 15);
	delete b;
	b->f1();

	system("pause");
	return 0;
}
дебажить заходя внутрь методоа f1 сначала в классе B потом в A. В A имеем следующую картинку

+ this 0xfeeefeee {x1=??? x2=??? x3=??? ...} A * const

причина проста - не обнулен указатель b после делита.
программа будет крашица, но причиной ошибки является не это место. на поиск реального места уйдет драгоценное время. это кстати опять же зависит от компилера и системы. чем заполняется освободившееся место. тут ошибка только благодаря тому что там нет страницы. попробуйте руками изменить адрес this на число например 0x00401000 =) вообще никакой ошибки. это повлечет еще более веселый дебаггинг. и это тот самый тип ошибок, который зависит от сосотяния адресного простарнства процесса. которые не повторяются при выполнении одной и той же послеовательности действий...

delete b;
b = 0;
b->f1();

исправляете так и легко узнаете о попытке обратиться к несуществующему объекту.
 
Ответить с цитированием