码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-05-31 18:21:19      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:

最近阅读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

 

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

标签:

原文地址:http://www.cnblogs.com/wangpei0522/p/4542223.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!