您的位置:首页 > 其它

如何限制一个类对象只在堆上分配或者只在栈上分配?

2013-08-23 17:21 267 查看
1.第一种说法
//只在栈上
class stackonly
{
private:
void * operator new(size_t Size)
{
}
};

//只在堆上
class heaponly
{
private:
heaponly(){}
~heaponly(){}
};


前者利用了c++的重载机制+访问控制机制。后者利用了c++的访问控制机制。

前者重载了new运算符,并设为私有,因此,当用 new stackonly;时编译器就会报错。

后者则将构造函数设为私有,因此,当你 heaponly h;时会自动调用构造函数,这时编译器也会报错。

这种技巧在c++中是很常用的比如设计模式中的单件模式。

2. 第二种说法

只在栈上的类:
// 私有重载new即可,但只是限制了不能建立在new出的堆上,并没有限制全局以及局部静态类,因此严格
// 来说不能算“只在栈上”
class A
{
private:
static   void   *operator   new   (size_t   size){};
};


C/C++ code
只在堆上的类:
// 私有化析构函数,通过一个public函数来进行实际的析构。
class B
{
public:
void del()const{ };
private:
~B(){};
};


3. 第三种说法

1 在C++中如何限制一个类对象只在堆上分配?

仿照设计模式中的单实例模式或者工厂模式来解决,这里采用单实例模式方式来说明。

将类的构造函数属性置为private,同时提供static成员函数getInstance,在函数中new一个新对象,然后返回对象指针或者引用。这样实现的类可以保证只可以在堆上分配对象。

2 在C++中如何限制一个类对象只在栈上分配?

重载类的new操作符,使重载后的new操作符的功能为空。这样就使外层程序无法在堆上分配对象,只可以在栈上分配。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: