我有一个关于如何限制堆或堆栈上的对象创建的问题?例如,如何确保对象不在堆上?如何确保一个物体不在堆栈上?
谢谢!
答案 0 :(得分:13)
为了防止在堆上意外创建对象,请为其提供私有运算符。例如:
class X {
private:
void *operator new(size_t);
void *operator new[](size_t);
};
为防止在堆栈上意外创建,请使所有构造函数都为私有,和/或使析构函数为私有,并提供执行相同功能的友元或静态函数。例如,这里有两个:
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();
};
答案 1 :(得分:2)
您可以通过使其构造函数为private并提供工厂(抽象工厂或工厂方法)来控制新对象的创建,从而阻止对象以自动持续时间(“在堆栈上”)声明。
你可以尝试通过使其operator new
私有来阻止动态分配对象(“在堆上”)。但是,这并不妨碍某人使用展示位置new
创建您的班级实例。
为什么要控制对象的分配方式?你想解决什么问题?
答案 2 :(得分:2)
要防止在堆栈上分配对象,请定义私有析构函数。这会导致基于堆栈的对象出现编译错误,因为当基于堆栈的对象超出范围时,它会禁止隐式析构函数调用。您将需要实现一个公共破坏方法,类似于:
void MyObject::destroy() const
{
delete this;
}
清理堆上分配的对象。请务必阅读C++ FAQ以获取一些警告。
同样,为了防止在堆上分配对象,请确保将new
运算符定义为私有。
答案 3 :(得分:0)
确保在堆上创建对象更容易。 new
运算符始终执行此操作。
确保对象在堆栈上更加困难。对于小对象,创建像MyType aObj;
这样的对象总是使用堆栈。对于类占用大量内存的对象,编译器可能不使用堆栈。