定位操作符new()的理解

class Screen {
public:
void *operator new( size_t );
void *operator new( size_t, Screen* );
// ...
};
额外的参数可以被new 表达式中指定的定位实参初始化例如
void func( Screen *start ) {
Screen *ps = new (start) Screen;
// ...
}

“new (start) Screen;”
这是定位new操作

Screen *ps = new (start) Screen;
表示在已经开辟好的内存区start中为堆对象Screen申请一个内存

也就是说,如果start占100个字节
你现在从它的第1个字节开始,往里面写入Screen

这样做今后要释放内存的时候有麻烦,如果Screen里面有指针,并开辟了空间,那么delete ps会调用析构函数,而start中的那块内存也丢失了,因为ps也指向了start.所以要避免这种情况,就要先ps->~Screen( )这样显示的调用Screen的析构函数,再delete [ ]start
 

posted @ 2007-03-23 09:23  MXi4oyu  阅读(150)  评论(0编辑  收藏  举报