Creare una classe unique_pointer per eliminare automaticamente i dati allocati dinamicamente senza chiamare la funzione delete.
Appena una istanza di unique_pointer viene rimossa dallo stack, il suo decostruttore eliminerà automaticamente anche i dati allocati nell'heap a cui punta.
L'overload degli operatori = e () permottono di effettuare assegnazioni dirette e perdere l'autorizzazione ad eliminare i dati se c'è un altro puntatore che punta agli stessi dati.
Appena una istanza di unique_pointer viene rimossa dallo stack, il suo decostruttore eliminerà automaticamente anche i dati allocati nell'heap a cui punta.
L'overload degli operatori = e () permottono di effettuare assegnazioni dirette e perdere l'autorizzazione ad eliminare i dati se c'è un altro puntatore che punta agli stessi dati.
PHP Code:
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
template <typename TIPO >class unique_pointer {
public:
//////////////////////// constructor, initialize the pointer and ownership
unique_pointer()
:pointer(NULL),
ownership(0)
{}
/////////////////////// the main utility of this class - delete the pointed data when it's removed from the stack
~unique_pointer(){
if ( (pointer != NULL) && (ownership==1))
delete pointer;
}
/////////////////// operator = defined to permit direct assignment
void & operator= (TIPO * in_pointer){
set_p(in_pointer);
}
//////////////////// operator () defined to pass the pointer to a general pointer and remove the permission to delete data
operator() ( TIPO * new_pointer ) {
new_pointer = pointer;
ownership = 0;
}
private:
void set_p ( TIPO * in_pointer){
pointer = in_pointer;
ownership = 1;
}
TIPO * pointer; // the pointer storage
int ownership; // permission to delete data
};
int main () {
unique_pointer <string > u_pointer; // create a smart pointer u_pointer;
u_pointer = new string("ciao"); // new return address to u_pointer
string* string_pointer; // general pointer to a string class
u_pointer(string_pointer); // u_pointer pass it's hidden pointer address to string_pointer
cin.get(); //
return 0;
}