
```c++
int *pin=new int {6}; //*pi set to 6;
double *pdo=new double {99.99}; //*pd set to 99.99;
new可能找不到请求的内存量。在最初的10年中,C++在这种情况 下让new返回空指针,但现在将引发异常std::bad_alloc。
```c++
void* operator new(std::size_t); //new
void* operator new[](std::size_t); //new[]
- 这些函数被称为分配函数(alloction function),它们位于全局名称空间中。同样,也有由delete和delete []调⽤的释放函数(deallocation function):
```c++
void* operator delete(std::size_t); //delete
void* operator delete[](std::size_t); //delete[]
int* pi=new int;将被替换为
```c++
//1
int* pi=new int;
//将被替换为
int* pi=new(sizeof(int));
//2
int* pa=new int[40];
//将被替换为
int* pa=new(40*sizeof(int));

出于简化的⽬的,这个⽰例使⽤两个静态数组来为定位new运算符提供内存空间。因此,上述代码从**buffer1中分配空间给结构chaff**,从 **buffer2中分配空间给⼀个包含20个元素的int数组。**
- 使⽤**常 规new运算符**和**定位new运算符**创建动态分配的数组。


delete [] pd1;
- 不能使⽤delete来释放使⽤定位new运 算符分配的内存。
- 事实上,在这个例⼦中不能这样做。buffer指定的内存是**静态内存**,⽽delete只能⽤于这样的指针:**指向常规new运算符分配的堆内存。**也就是说,数组buffer位于delete的管辖区域之外,
- 如果buffer是使⽤常规new运算符创建的,便可以使⽤常 规delete运算符来释放整个内存块。
- 定位new运算符的另⼀种⽤法是,**将其与初始化结合使⽤**,从⽽将 信息放在特定的硬件地址处。
标准定位 new调⽤⼀个接收两个参数的new()函数:
定位new函数不可替换,但可重载。它⾄少需要接收两个参数,其 中第⼀个总是std::size_t,指定了请求的字节数。这样的重载函数都被称为定义new,即使额外的参数没有指定位置。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。