定位操作符new()的理解

    技术2022-05-11  21

    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 


    最新回复(0)