如何限制一个类只在堆上分配和栈上分配(StackOnly HeapOnly)

【本文链接】

http://www.cnblogs.com/hellogiser/p/stackonly-heaponly.html

【题目】

如何限制一个类只在堆上分配和栈上分配?

【代码】

C++ Code


1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
class StackOnly
{
private:
    void *operator new(size_t size) {};
};

class HeapOnly
{
public:
    void destroy();
private:
    HeapOnly() {};
    ~HeapOnly() {};
};

【分析】

前者利用了c++的重载机制+访问控制机制。后者利用了c++的访问控制机制。
前者重载了new运算符,并设为私有,因此,当用 new stackonly;时编译器就会报错。
后者则将构造函数设为私有,因此,当你 heaponly h;时会自动调用构造函数,这时编译器也会报错。

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

【参考】

http://blog.csdn.net/wonengxing/article/details/6862971

时间: 2024-10-12 13:22:23

如何限制一个类只在堆上分配和栈上分配(StackOnly HeapOnly)的相关文章

JVM之对象分配:栈上分配 & TLAB分配

1. Java对象分配流程 2. 栈上分配 2.1 本质:Java虚拟机提供的一项优化技术 2.2 基本思想: 将线程私有的对象打散分配在栈上 2.3 优点: 2.3.1 可以在函数调用结束后自行销毁对象,不需要垃圾回收器的介入,有效避免垃圾回收带来的负面影响 2.3.2 栈上分配速度快,提高系统性能 2.4 局限性: 栈空间小,对于大对象无法实现栈上分配 2.4 技术基础: 逃逸分析 2.4.1 逃逸分析的目的: 判断对象的作用域是否超出函数体[即:判断是否逃逸出函数体] //user的作用域

C++中如何设计一个类只能在堆或者栈上创建对象

设计一个类,该类只能在堆上创建对象 将类的构造函数私有,拷贝构造声明成私有.防止别人调用拷贝在栈上生成对象. 提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建 注意 在堆和栈上创建对象都会调用构造函数,为了防止在栈上创建对象我们将构造函数私有化. 拷贝构造函数是在栈上创建对象. 1 class HeapOnly 2 { 3 public: 4 static HeapOnly* CreateObject() 5 { 6 return new HeapOnly;//这使得创建该类对象都只能

selenium+python+unittest:一个类中只执行一次setUpClass和tearDownClass里面的内容(可解决重复打开浏览器和关闭浏览器,或重复登录等问题)

unittest框架是python自带的,所以直接import unittest即可,定义测试类时,父类是unittest.TestCase. 可实现执行测试前置条件.测试后置条件,对比预期结果和实际结果,检查程序的状态,生成测试报告. 且断言的话unittest框架很方便. 在这主要记录下setUp()和tearDown()这两个的问题,每次执行一个测试用例(test开头的方法),就会执行一次setUp()和tearDown(), 导致执行多个测试用例时,会反复的打开浏览器操作,这个很浪费时间

如何定义一个类——单一职责原则

单一职责原则:就一个类而言,应该仅有一个引起他变化的原因. 1 一个老师类的例子 或者说在外部看来,一个类只应该能看到它的类的相关功能.如老师类只应该负责教授知识,备课,但是不应该负责开车.切合实际的说一个TaskService类不应该包含处理时间的类,他可以是private的,但是肯定不能是public的.这里引出另一个角度 2 如何看待一个类? 2.1通常的看法 通常的看法是,类是由成员属性和成语方法组成的数据结构或者是现实事物的抽象如对现实中的人抽象出Person,他具备人的基本属性和基本

【深入浅出-JVM】(7):栈上分配

概念 对那些作用于不会逃逸出方法的对象,在分配内存时,不在将对象分配在堆内存中,而是将对象属性打散后分配在线程私有栈内存上,这样随着方法调用结束,栈上分配打散的对象也被回收掉,不在增加 GC 额外压力. Java 对象分配流程 示例 循环创建1000000000一个对象,阻止栈上分配 栈上分配条件:开启逃逸分析 & 开启标量替换 JVM 参数: 弃用逃逸分析(不允许判断对象是否可以逃逸出函数体) -server -Xmx10m -Xms10m -XX:-DoEscapeAnalysis -XX:

如何限制一个类对象只在栈(堆)上分配空间?

最近做了一道题:在C++中,为了让某个类只能通过new来创建(即如果直接创建对象,编译器将报错) 其实该问题等同于如何限制一个类对象只在栈(堆)上分配空间? 一般情况下,编写一个类,是可以在栈或者堆分配空间.但有些时候,你想编写一个只能在栈或者只能在堆上面分配空间的类.这能不能实现呢?仔细想想,其实也是可以滴. 在C++中,类的对象建立分为两种,一种是静态建立,如A a:另一种是动态建立,如A* ptr=new A:这两种方式是有区别的. 1.静态建立类对象:是由编译器为对象在栈空间中分配内存,

如何定义一个只能在堆上(栈上)生成对象的类?

在C++中,类的对象建立分为两种,一种是静态建立,如A a:另一种是动态建立,如A* ptr=new A:这两种方式是有区别的. 静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象.使用这种方法,直接调用类的构造函数. 动态建立类对象,是使用new运算符将对象建立在堆空间中.这个过程分为两步,第一步是执行operator new()函数,在堆空间中搜索合适的内存并进行分配:第二步是调用构造函数构造对象,初

C/C++知识要点6——定义只能在堆/栈上生成对象的类

在C++中,类的对象建立分为两种,一种是静态建立,如A a:另一种是动态建立,如A* ptr=new A: 区别: 静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象.使用这种方法,直接调用类的构造函数. 动态建立类对象,是使用new运算符将对象建立在堆空间中.这个过程分为两步,第一步是执行operator new()函数,在堆空间中搜索合适的内存并进行分配:第二步是调用构造函数构造对象,初始化这片内存空

定义一个只能在栈上构造对象的类

只能在堆上定义的对象可以通过声明构造函数是私有的,然后提供两个静态的方法,一个方法用来获取堆上的对象,一个用来释放堆上的对象.C++中定义一个不能被继承的类中第二种方法就是通过这种方式声明了一个不能被继承的类,但是这个类的对象就只能位于堆中了. 那么如何一定一个只能在栈上构造的对象? 这个就涉及到了C++中new这个操作符,它包含两步: 调用一个全局的operator new函数分配一定的内存空间 调用对象的构造函数 如果不允许一个类在堆上分配内存,但是允许其在栈上分配内存,对比这两种方式可以发