Boostを使ってよければ、参照カウントのスマートポインタは既にある。
boost::shared_ptr<T>とboost::shared_array<T>。
それぞれT型(及びT型へ変換できる型)でnewしたもの、T型でnew []したもの用。

特にboost::shared_ptr<void>には、newしたものなら何でも入る。
それどころか削除子(削除処理する関数オブジェクト)さえ指定すれば実質的に何でも入れられる。