限制在C ++中堆和堆栈上的对象的创建

时间:2010-03-03 18:08:55

标签: c++

我有一个关于如何限制堆或堆栈上的对象创建的问题?例如,如何确保对象不在堆上?如何确保一个物体不在堆栈上?

谢谢!

4 个答案:

答案 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;这样的对象总是使用堆栈。对于类占用大量内存的对象,编译器可能不使用堆栈。