
04.05.2009, 22:47
|
|
Постоянный
Регистрация: 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();
исправляете так и легко узнаете о попытке обратиться к несуществующему объекту.
|
|
|