More Effective C++ 条款27 要求(禁止)对象产生与heap之中
2015-10-06 12:23
429 查看
1. 要求对象产生于堆中
由于non-heap 对象会在定义时自动构造,并在寿命结束时自动析构,因此要阻止客户产生non-heap对象,只需要将构造或析构函数声明为private.又由于构造函数可能有多个,儿媳够函数只有一个,因此更好的选择是将析构函数声明为private,然后开放一接口调用它,像这样:
View Code
operator new和operator delete一同设为private是为了统一它们的访问层级,值得注意的是,将operator new声明为private,也会阻止UPNumber对象被实例化为heap-based derived class objects的"base class 成分",因为operator new和operator delete都会被继承,如果这些函数不再derived class中重定义,derived class使用的就是base class版本(但已被设为private)
但如果derived class声明自己的operator new和operator delete或涉及到内含的情况时,对象仍然可能位于heap内,正如2所总结,没有一个有效办法判断一个对象是否位于heap内.
由于non-heap 对象会在定义时自动构造,并在寿命结束时自动析构,因此要阻止客户产生non-heap对象,只需要将构造或析构函数声明为private.又由于构造函数可能有多个,儿媳够函数只有一个,因此更好的选择是将析构函数声明为private,然后开放一接口调用它,像这样:
class UPNumber { private: static void *operator new(size_t size); static void operator delete(void *ptr); ... };
View Code
operator new和operator delete一同设为private是为了统一它们的访问层级,值得注意的是,将operator new声明为private,也会阻止UPNumber对象被实例化为heap-based derived class objects的"base class 成分",因为operator new和operator delete都会被继承,如果这些函数不再derived class中重定义,derived class使用的就是base class版本(但已被设为private)
但如果derived class声明自己的operator new和operator delete或涉及到内含的情况时,对象仍然可能位于heap内,正如2所总结,没有一个有效办法判断一个对象是否位于heap内.
相关文章推荐
- C++ 内存管理
- c++享元模式
- C/C++递归之汉诺塔求解
- C++ 编译出现字符串常量转化问题
- C++ 函数新特性
- c++ & java解析JSON格式数组
- C语言-九宫格
- C++模板函数
- c++ for_each
- ubuntu下C,C++,opencv cuda编程
- C++ const关键字
- C++中typename实例
- C语言-蜗牛爬墙
- 详解C++中基类与派生类的转换以及虚基类
- C语言-八皇后问题
- [LeetCode] 033. Search in Rotated Sorted Array (Hard) (C++)
- C++单链表2
- 对C语言输入输出流和缓冲区的深入理解
- Java/C++之 public、protected、private ; virtual & abstract
- C++引用