我们知道在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:析构对象------显式析构调用
推荐阅读
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- C/C++|C/C++ basis 02
- Qt实战|Qt+OpenCV联合开发(二十一)--图像翻转与旋转
- Qt实战|Qt+OpenCV联合开发(十四)--图像感兴趣区域(ROI)的提取
- Qt实战|Qt+OpenCV联合开发(十三)--通道分离与合并
- opencv|Qt+OpenCV联合开发(十六)--图像几何形状绘制
- Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色
- SNAT的MASQUERADE地址选择与端口选择
- IPTABLES的连接跟踪与NAT分析
- IPVS分析