#include #include using namespace std; #if 0 struct X { ~X() { cout << "destr\n"; } }; template struct ArrayDeleter { void operator()(T* p) { delete [] p; } }; int main() { shared_ptr sp{ new X[3], ArrayDeleter{} }); shared_ptr sp{ new float[16], ArrayDeleter{} }; } #else //SHAREDARRAY struct X { ~X() { cout << "destr\n"; // show the object's destruction } }; template class shared_array: public shared_ptr { struct Deleter // Deleter receives the pointer { // and calls delete[] void operator()(Type* ptr) { delete[] ptr; } }; public: shared_array(Type *p) // other constructors : // not shown here shared_ptr(p, Deleter()) {} Type &operator[](size_t idx) // index operators { return shared_ptr::get()[idx]; } Type const &operator[](size_t idx) const { return shared_ptr::get()[idx]; } Type &operator*() = delete; // delete pointless members Type const &operator*() const = delete; Type *operator->() = delete; Type const *operator->() const = delete; }; int main() { shared_array sp{ new X[3] }; sp[0] = sp[1]; } //= #endif