如何定位放置new

标准首部<new>由一个特别的操作符new来定义,这个就是我们熟知的placement new。和其他普通的new不同的是,它在括号里多了另外一个参数。比如:

Widget * p = new Widget; //普通的new pi = new (ptr) int; //placement new

括 号里的参数是一个指针,它指向一个内存缓冲器,placement new将在这个缓冲器上分配一个对象。Placement new的返回值是这个被构造对象的地址。在对时间要求非常高的应用程序中,placement new是非常有用的,因为这些程序分配的时间是确定的,它们必须长时间的运行并要进行垃圾回收。

使用方法

在一些时候placement new的使用方法和其他普通的new不同。这里提供了它的使用方法。

第一步  缓存提前分配

确定被placement new使用的缓存区的内存队列已经准备好,使用普通的new来分配它:

class Task {/*..*/};
char * buff = new [sizeof(Task)];
//分配内存

第二步:对象的分配

在刚才已分配的缓存区调用placement new来构造一个对象。

Task *ptask = new(buff) Task

第三步:使用

按照普通方式利用分配的对象:

ptask->suspend();
ptask->resume();

//...

第四步:对象的毁灭

一旦你使用完这个对象,你必须调用它的析构函数来毁灭它。按照下面的方式调用析构函数:

ptask->~Task(); //调用外在的析构函数

第五步:释放

你可以反复利用缓存并给它分配一个新的对象(重复步骤2,3,4)如果你不打算再度使用这个缓存,你可以象这样释放它:

delete [] buff;

如果跳过任何步骤就可能导致运行时间的崩溃,内存不够,以及其他的意想不到的状况。如果你需要使用placement new,请按照上面步骤一步步的执行。

 

摘自:http://frankyyu.blog.sohu.com/1684991.html

<think>好的,我现在需要回答用户的问题:“定位new的作用”。首先,我得回想一下C++中关于定位new的知识点。定位newplacement new)是C++中的一种特殊形式的new操作符,它允许在预分配的内存中构造对象,而不是动态分配新的内存。 接下来,我需要确认定位new的主要用途和场景。常见的用途包括在特定内存地址创建对象,比如内存池管理、硬件寄存器操作或者需要精确控制内存布局的情况。例如,在嵌入式系统中,可能需要将对象放置在特定的内存区域,这时候定位new就非常有用。 然后,我应该解释定位new的基本语法。通常,定位new的表达式形式是`new (buffer) ClassName(args)`,其中buffer是一个预先分配的内存块。这时候,new操作符不会分配内存,而是直接在buffer上构造对象。 还需要提到,使用定位new时,程序员需要自己管理内存的生命周期。因为定位new不会分配内存,所以对象销毁时不需要调用delete,而是显式调用析构函数,比如`obj->~ClassName()`。 可能需要注意的点包括:确保预分配的内存足够大且对齐正确,否则会导致未定义行为。此外,定位new不会处理内存分配失败的情况,因为内存已经分配好了,所以不需要像普通new那样处理异常。 然后,我需要组织语言,将这些知识点连贯地表达出来,确保用户能够理解定位new的作用、使用方法以及注意事项。同时,要避免过于技术化的术语,用通俗易懂的语言解释。 最后,根据用户要求,在回答末尾提出3-5个相关问题。这些问题应该围绕定位new的应用场景、与普通new的区别、内存管理注意事项等,帮助用户进一步深入理解该主题。 现在检查是否有遗漏或错误的地方。比如,是否提到了定位new的头文件?通常,使用定位new需要包含`<new>`头文件,但用户的问题可能更关注作用而非具体语法细节。是否需要举例说明?虽然用户没有要求代码示例,但适当提及使用方式有助于理解。不过根据用户示例,可能不需要代码,但需要明确步骤。 总结回答结构:定义、作用、使用场景、注意事项、相关问题。</think>定位new的作用是在已分配的内存地址上直接构造对象,而非动态分配新内存。其核心功能包括: 1. **内存复用**:允许在预分配的内存(如内存池、栈内存或共享内存)中创建对象,提升性能并控制内存布局。 2. **精确控制**:适用于嵌入式系统、硬件寄存器映射等需指定内存地址的场景。 3. **跳过内存分配**:仅调用构造函数,避免重复分配内存,需手动调用析构函数销毁对象。 使用时需确保目标内存大小足够且对齐正确,例如: ```cpp char buffer[sizeof(MyClass)]; // 预分配内存 MyClass* obj = new(buffer) MyClass(); // 在buffer中构造对象 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值