Witajcie. Wczoraj natrafiłem na pewien problem dotyczący kopiowania wskaźników. Najlepiej problem przedstawi poniższy kod
#include <iostream>
using namespace std;
class Foo
{
public:
int a, b, c, d;
Foo() {a = 0, b = 2, c = 5, d = 4;}
};
class Foo2
{
public:
Foo* f;
Foo2() {f = NULL;}
Foo2(Foo* _f)
{
f = _f;
}
Foo2& operator=(const Foo2& f2)
{
this->f = f2.f;
}
void doSthWithF()
{
cout << f->b; //proba odczytania z juz nie istniejacego f
}
~Foo2()
{
delete f;
}
};
int main()
{
Foo* f = new Foo();
Foo2 f2; //tworzymy obiekt klasy Foo2 wywołując domyślny konstruktor
f2 = Foo2(f); //przypisujemy do f2 obiekt klasy Foo2 wywołany z konstruktorem przyjmującym Foo*
//spoko. Tylko co sie stanie jesli przypiszemy ten wskaznik do f2.f, a potem wykonamy dekstuktor na obiekcie tymczasoym?
f2.doSthWithF(); //to wypisze smieci lub będzie naruszenie ochrony pamięci
return 0;
}
Pytanie brzmi. Jak uniknąć takich skutków? Czy może tak się po prostu nie robi i są inne, bardziej poprawne sposoby na to co chciałem zrobić w powyższym kodzie?
Byłbym wdzięczny za wszystkie odpowiedzi, bo mi nic do głowy nie przychodzi.
PS. W google nie szukałem, bo kompletnie nie wiedziałem jakiej frazy użyć