You can prevent the usage of delete operator on pointer of certain classes.
For example:
class Object {
public: void operator delete(void* p) = delete;
};
class Entity : public Object { };
int main(int argc, char const *argv[])
{
Object* o = new Object;
Entity* e = new Entity;
delete o; // compiler error
delete e; // compiler error
return 0;
}
For all classes that inherit from Object can not be deleted because the Object::operator delete was deleted. Don't mark this operator as private because it will give a compiler error when deriving or instantiating the Object class. Be aware that we can still do so:
::operator delete(o);
Which will free the o pointer but won't call the destructor.
Use a class to manager the life time of the Object class. A simple implementation would be:
class Object {
template<typename type> friend class ptr;
public: void operator delete(void* p) = delete;
};
class Entity : public Object { };
template<typename type>
class Ptr {
public:
Ptr(type* obj) : o(obj){}
~Ptr() { o->~type(); ::operator delete(o); }
private: type* o;
};
int main(int argc, char const *argv[])
{
Object* o = new Object;
Entity* e = new Entity;
// delete o; // error
// delete e; // error
Ptr<Entity> ent = new Entity; // Ptr will delete ent for you.
return 0;
}