C++中只在栈上或者堆上申请对象

最近阅读Mitsuba的架构,有一个挺有意思的设计,开始没看明白。搜了下资料才搞懂。

有一个基类Object,它的析构函数是protected访问权限的。并且,所有继承Object的类,都需要实现一个自己的protected的析构函数。

Mitsuba还特意解释了,这是为了防止在stack上构建Object的对象。

这是怎么回事呢?

编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。“

采用protected的目的是为了能够让类能够正常的被继承。但是!要保持子类也不能在栈上申请对象,必须保持子类的析构函数也是protected/private(若是private子类不能被继承,更多信息查看 http://www.cnblogs.com/wangpei0522/p/4460425.html)

为什么new可以呢?

我们知道new是C++的一个操作符,实际上,operator new是类对象的一个成员函数,所以能够正常的申请对象。



与防止在stack上构建对象的设计所对应的方案是

防止在heap上构建对象

有了上面的基础,你肯定能立马想到设置operator new()的访问权限设置为protected/private

时间: 2024-08-28 01:24:49

C++中只在栈上或者堆上申请对象的相关文章

对象只能建立在栈上(堆上)

只能建立在栈上: //禁用new操作符,变量就只能定义在栈上了,new operator首先调用operator new,把operator new定义为private即可class A{ private: void* operator new(size_t t){} void operator delete(){} public: A(){} } 只能建立在堆上: //不能直接调用析构函数,那么就无法在栈上建立对象,在堆上建立对象是间接调用构造函数的,所以可以! //当然虽然可以在堆上建立对象

C++只在栈或堆上实例化对象

C++如何让类对象只能在堆(栈)上分配空间 一般情况下写一个类都是可以采用new在堆上分配空间,或直接采用 类名+对象名 的方式在栈上分配空间.但有时候,如果想让一个类只能在栈上或者堆上分配空间,又该怎么实现呢? 下面分别来介绍如何定义只能在栈上或堆上实例化的类. 注:1.静态实例化对象 如 A a;的步骤为:先由编译器为对象在栈空间分配内存,移动栈顶指针,挪出适当的空间,然后在这个空间上调用构造函数形成一个对象,在对象使用完之后,调用析构函数回收内存,栈顶指针减一.2.动态实例化对象:new操

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

[本文链接] http://www.cnblogs.com/hellogiser/p/stackonly-heaponly.html [题目] 如何限制一个类只在堆上分配和栈上分配? [代码] C++ Code 1234567891011121314   class StackOnly { private:     void *operator new(size_t size) {}; }; class HeapOnly { public:     void destroy(); private

如何让类对象只在栈(堆)上分配空间?(转)

转自:http://blog.csdn.net/hxz_qlh/article/details/13135433 在C++中,类的对象建立分为两种,一种是静态建立,如A a:另一种是动态建立,如A* ptr=new A:这两种方式是有区别的. 1.静态建立类对象:是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数 形成一个栈对象.使用这种方法,直接调用类的构造函数. 2.动态建立类对象,是使用new运算符将对象建立在堆空间中.这个过程分为

C++中栈和堆上建立对象的区别

在C++中类的对象建立分为两种,一种是静态建立,如A a:另一种是动态建立,如A* p=new A(),A*p=(A*)malloc():静态建立一个类对象,是由编译器为对象在栈空间中分配内存,通过直接移动栈顶指针挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象.动态建立类对象,是使用new运算符将对象建立在堆空间中,在栈中只保留了指向该对象的指针.栈是由编译器自动分配释放 ,存放函数的参数值,局部变量的值,对象的引用地址等.其操作方式类似于数据结构中的栈,通常都是被调用时处于存储

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

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

Java中的栈内存和堆内存

为什么我们常说基本类型传递的是具体的值,而对象传递的是对象的内存地址呢.要搞清楚这个问题就要搞清楚栈内存与堆内存. java的内存分为栈内存和堆内存,两者的作用是不同的,我们可以简单的理解如下: 当我们创建一个java基本类型的变量时,只会用到栈内存而不会用到堆内存,栈内存中所存储的内容就是基本类型的值. int a = 3;  int b = 3; 执行第一行 int a = 3;时,JVM先会创建一个变量为a的引用,然后在栈内存中查找是否已经存在3这个值,没有找到,就会在栈内存中开辟一片区域

如何限制对象只能建立在堆上或者栈上(转载)

转载:http://blog.csdn.net/szchtx/article/details/12000867 在C++中,类的对象建立分为两种,一种是静态建立,如A a:另一种是动态建立,如A* ptr=new A:这两种方式是有区别的. 静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象.使用这种方法,直接调用类的构造函数. 动态建立类对象,是使用new运算符将对象建立在堆空间中.这个过程分为两步,第

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

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