C/C++笔试题目|operator new 函数、operator delete 函数 和 定位 new

我们知道在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 object void *operator new [ ] (size_t); //allocate an arrayvoid *operator delete (void*); //free an object void *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 :
【C/C++笔试题目|operator new 函数、operator delete 函数 和 定位 new】allocate:分配内存-----operator new
deallocate:释放内存----operator delete
construct:构建对象-----定位new
destory:析构对象------显式析构调用





    推荐阅读