@MarekR22: dokładnie, post swój puszczałem z nieodświeżonej strony.
Jeśli dokładnie znamy sytuację autora, to nie auto_ptr, a jakiś shared_ptr z boosta będzie potrzebny - ogólnie jakiś zliczający referencje. Jeśli cię ciekawi, jak to się w zarysie realizuje, to rzuć okiem sobie na plik
counted_pointer.hpp.
Kod używający go wyglądałby mniej więcej tak:
#include <iostream>
#include "counted_pointer.hpp"
using namespace std;
struct MyObject {
int value;
MyObject(int v) : value(v) { cout << "T(" << value << ")" << endl; }
~MyObject() { cout << "~T" << endl; }
};
int main() {
memory::safe_ptr<MyObject> a,b;
a = new MyObject(7);
b = a;
cout << (a ? a->value : -666) << endl;
// usuwamy obiekt na siłę
force_delete(a);
if(b)
cout << b->value << endl;
else
cout << -666 << endl;
// te instrukcje nic nie zrobią
force_delete(a);
force_delete(b);
return 0;
}
a w ogóle, ponieważ użyliśmy safe_ptr, to WCALE nie musimy pamiętać o force_delete: jak znikną wszystkie wskaźniki to pamięć się zwolni. Można więc nawet jeszcze zabawniej:
int main() {
memory::safe_ptr<MyObject> a,b;
a = new MyObject(7);
b = a;
a = 0;
cout << "---" << endl;
// poniżej stanie się cud: zniknie ostatni pointer do MyObject(7)
// efekt: ruszy do pracy jego destruktor
b = new MyObject(16);
cout << "---" << endl;
return 0;
}