operator new 函数、operator delete 函数 和 定位 new

来源:互联网 发布:三体结局 知乎 编辑:程序博客网 时间:2024/05/17 03:15

我们知道在C++中申请内存空间和释放内存空间是用new和delete来完成,我们先来看new表达式:

string *sp = new new string("initialized");
实际上发生了三个步骤:

(1)首先,该表达式调用名为operator new的标准库函数,分配足够大的原始的未类型化的内存,以保存指定类型的一个对象;

(2)接下来,运行该类型的一个构造函数,用指定初始化式构造对象;

(3)最后,返回指向新分配并构造的对象的指针。

再来看delete表达式:

delete sp;
当使用delete表达式delete sp;删除动态分配对象的时候,发生两个步骤:

(1)首先,对sp指向的对象运行适当的析构函数;

(2)然后,通过调用名为operator delete 的标准库函数释放改对象所用的内存。

1.operator new 和 operator delete 接口

operator new 和 operator delete 函数有两个重载版本,每个版本支持相关的new表达式和delete表达式:

void *operator new(size_t);  //allocate an objectvoid *operator new [ ] (size_t);  //allocate an arrayvoid *operator delete (void*);  //free an objectvoid *operator delete [ ] (void*)  //free an array
2.定位new表达式

标准库函数operator new 和 operator delete 是allocator和deallocate成员的低级版本,它们都分配但不初始化内存。

allocator的成员,有第三章new表达式,称为定位new(placement new)。定位new表达式在已分配的原始内存中初始化一个对象,它与new的其他版本的不同之处在于,它不分配内存。相反,它接受指向已分配但尚未构造内存的指针,并在该内存中初始化一个对象。实际上,定位new表达式使我们能够在特定的、预分配的内存地址构造一个对象。实际上,定位new表达式使我们能够在特定的、预分配的内存地址构造一个对象。

定位new表达式的形式是:

new (place_address) type

new (place_address) type (initializer-list)

其中place_address必须是一个指针,而initializer-list提供了(可能为空的)初始化列表,以便在构造新分配的对象时使用。

allocator<T> :   

    allocate:分配内存-----operator new

    deallocate:释放内存----operator delete

    construct:构建对象-----定位new

    destory:析构对象------显式析构调用



0 0
原创粉丝点击