首页 > 编程语言 > 详细

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

时间:2015-05-31 18:18:03      阅读:420      评论: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
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!