Effective C++学习笔记-内存管理
条款10:如果写了operator new就要同时写operator delete
这样做是为了效率,也就是当一个类的size很小的时候,如果需要频繁的new和delete对象,也即大量的分配释放小的内存块,这样不仅会造成系统内存碎片,性能也会很差。这个时候我们可以在new第一个对象的时候分配一个很大的Pool资源池,这样在接下来频繁的new这个对象时,就从这个资源池里分内存就行而不是调用::operator new,而delete对象时则将内存放回到Pool中,而非调用::operator delete。
条款11:为需要动态分配内存的类声明一个拷贝构造函数和一个肤质操作符
char* data的浅拷贝和深拷贝
条款12:尽量使用初始化而不是在构造函数中赋值
同样是为了效率,减少没必要的赋值操作。注意const类型和引用类型的数据成员只能用初始化。
条款13:初始化列表中成员勒出的顺序和他们在类中声明的顺序相同
类成员是按照他们在类里呗声明的顺序进行初始化的,和他们在成员初始化列表中的列出的顺序没一点关系。
条款14:确定基类有虚析构函数
当通过积累的指针去删除派生类的对象,而基类有没有虚析构函数时,结果将是不可确定的。如果无故的声明虚函数(这个虚函数将不可能成为父类)时,需要考虑这个虚函数将会增加一个额外的指针,也就类的sizeof()大小问题。当且仅当类里包含至少一个虚函数的时候才去声明徐析构函数,这个说法也是不靠谱的。
条款15:让operator=返回*this的应用
如果operator=返回void会影响连续赋值。对于C& oprator=(const C&);考虑到参数是const或者在函数中产生的临时对象为const,这样返回是非法的。即如果不这样做,就会导致不能连续赋值,或导致调用时的隐式类型转换不能进行。
条款16:在operator=中对所有数据成员赋值
这里要要说的是包括对基类各个成员的赋值,如果基类自己实现了operator=则要在子类的operator=()中调用Base::operator=()给父类也重新赋值,如果基类的赋值运算符是编译器生成的,则可将子类强制转换成父类,再赋值,即static_cast<Base&>(*this) = rhs;同样的道理,在拷贝构造函数里面也要执行基类的拷贝构造函数。
条款17:在operator=中要考虑给自己赋值的情况
有些对象需要分别判断其成员变量(如指针或指针指向的数据)是否相等,而有些只需判断对象是否是同一个引用即可,这些都得在根据实际的需求来写operator=()。
不积跬步无以至千里,不积小流无以成江河。