小智 15
为了防止在堆上意外创建对象,请为其提供新的私有操作符.例如:
class X {
private:
void *operator new(size_t);
void *operator new[](size_t);
};
Run Code Online (Sandbox Code Playgroud)
要防止在堆栈上意外创建,请使所有构造函数都为私有,和/或使析构函数为私有,并提供执行相同功能的友元或静态函数.例如,这里有两个:
class X {
public:
static X *New() {return new X;}
static X *New(int i) {return new X(i);}
void Delete(X *x) {delete x;}
private:
X();
X(int i);
~X();
};
Run Code Online (Sandbox Code Playgroud)
为了防止在堆栈上分配对象,请定义私有析构函数。这会导致基于堆栈的对象出现编译错误,因为当基于堆栈的对象超出范围时,它会禁止隐式析构函数调用。您将需要实现一个公共销毁方法,大致如下:
void MyObject::destroy() const
{
delete this;
}
Run Code Online (Sandbox Code Playgroud)
清理在堆上分配的对象。请务必阅读C++ 常见问题解答以了解一些注意事项。
同样,为了防止在堆上分配对象,请确保将new运算符定义为私有。