more effective C++条款八解读

时间:2022-03-28 04:00:40

了解不同意义的new和delete

这里所说的new是new operator,operator new 以及placement new。

首先我们明确new操作符需要完成两个工作,一个是调用operator new分配一定的内存空间,调用对象的构造函数。如果我们我们打算自己给对象分配内存,那么我们定义自己的operator new,在调用new操作符,那么new操作符会调用我们的operator new来构建对象。同时operator new也可以用来分配内存,返回的是void *型的原始内存。placement new的主要用途是在已经分配的内存上构建我们的对象。

例如

 widget * constructWidgetInBuffer(void *buffer,int widgetSize)
{
return new (buffer) Widget(widgetSize);
}


对于delete operator也一样 他先调用对象的析构函数在调用operator delete析构函数。值得注意的一点是,我们利用placement new构建的对象我们需要显示的调用析构函数,并且不要使用delete operator。

以下是例子:

void *mallocShared(size_t size);
void freeShared(void * memory);
void *sharedMemor=mallocShared(size_t size);
Widget *pw=constructWidgetINbuffer(sharedMemory,10);
pw->~Widget();
freeShared(pw);
针对利用new来申请数组的情况:

1.new 会调用operator new[]来分配内存,然后再一个一个的调用构造函数就行构造。

2.delete []会析构每一个对象,再释放相应的内存。