6.1 对象的构造和析构
全局对象
一般而言我们会把 object 尽可能放置在使用它的那个程序区段附近,这么做可以节省非必要的对象产生操作和摧毁操作。
C++程序中所有的 global objects 都被放置程序的 data segment 中。也就是静态变量区。
局部静态对象
const Matrix& identity()
{
static Matrix mat_identity;
//...
return mat_identity;
}
- mat_identity 的 constructor 只能执行一次。
- mat_identity 的 destructor 只能执行一次。
只在 identity() 被调用时才把 mat_identity 构造起来。(导入一个临时性对象以保护 mat_identity 的初始化操作,其实就是一个 flag)
6.2 new 和 delete 运算符
library 对于 new 运算符的实现操作都很直截了当,(以下并未考虑 exception handling)
extern void* operator new( size_t size)
{
if( size == 0)
size = 1;
void* last_alloc;
while(!(last_alloc = malloc(size)))
{
if( _new_handler)
(*_new_handler)();
else
return 0;
}
return last_alloc;
}
extern void operator delete( void* ptr)
{
if(ptr)
free((char*)ptr);
}
最后就是避免以一个 base class 指针指向一个 derived class objects 所组成的数组。否则destructor很麻烦,下面是个解决之道。
for( int ix = 0; ix < elem_count; ++ix)
{
Point3d* p = &((Point3d*)ptr)[ ix ];
delete p;
}
临时性对象
- 临时性对象的被摧毁,应该是对完整表达式求值过程中的最后一个步骤。该完整表达式造成临时对象的产生。
- 凡持有表达式执行结构的临时性对象,应该存留到 object 的初始化操作完成为止。
- 如果一个临时性对象被绑定于一个 reference,对象将残留,直到被初始化之 reference 的生命结束,或直到临时对象的生命范畴结束。