imho ist C für sowas einfach nicht gemacht. Da fehlt die
Operatorüberladung, ohne die der Code für den Betrachter nur noch sehr
schwer parse-bar wird.
außerdem der automatische Destruktoraufruf beim Verlassen des Scopes.
Ein großes Manko an dem Code ist, dass es nicht unterbunden wird, den
Pointer von Hand zu kopieren, oder zu setzten.
Dies könnte man erreichen, indem man eine Struktur für den Smartpointer
erzeugt, die man nicht einfach mit pointer=NULL; beschreiben kann.
Nachteil ist, dass die Struktur dann einen void* haben muss.
Das könnte man durch Macros, die Templates emulieren, lösen.
Du definierst eine BasisPointerStruktur mit einem void* und die
operationen, wie copy, alloc, dealloc und erzeugst mit MACROS speziell
für einen Typ inline-Funktionen, die intern die Basisfunktionen
aufrufen.
Aber all die Mühe lohnt sich nicht, weil die Hauptfehlerquelle, das
vergessen der Pointerfreigabe ist.