placement new操作符

acement new是operator new的一个重载版本,只是我们很少用到它。如果你想在已经分配的内存中创建一个对象,使用new是不行的。也就是说placement new允许你在一个已经分配好的内存中(栈或堆中)构造一个新的对象。原型中void*p实际上就是指向一个已经分配好的内存缓冲区的的首地址。

我们知道使用new操作符分配内存需要在堆中查找足够大的剩余空间,这个操作速度是很慢的,而且有可能出现无法分配内存的异常(空间不够)。placement new就可以解决这个问题。我们构造对象都是在一个预先准备好了的内存缓冲区中进行,不需要查找内存,内存分配的时间是常数;而且不会出现在程序运行中途出现内存不足的异常。所以,placement new非常适合那些对时间要求比较高,长时间运行不希望被打断的应用程序。

使用方法如下:

1. 缓冲区提前分配

可以使用堆的空间,也可以使用栈的空间,所以分配方式有如下两种:

class MyClass {…};

char *buf=new char[N*sizeof(MyClass)+ sizeof(int) ] ; 或者char buf[N*sizeof(MyClass)+ sizeof(int) ];

2. 对象的构造

MyClass * pClass=new(buf) MyClass;

3. 对象的销毁

一旦这个对象使用完毕,你必须显式的调用类的析构函数进行销毁对象。但此时内存空间不会被释放,以便其他的对象的构造。

pClass->~MyClass();

4. 内存的释放

如果缓冲区在堆中,那么调用delete[] buf;进行内存的释放;如果在栈中,那么在其作用域内有效,跳出作用域,内存自动释放。

注意:

1)        在C++标准中,对于placement operator new []有如下的说明: placement operator new[] needs implementation-defined amount of additional storage to save a size of array. 所以我们必须申请比原始对象大小多出sizeof(int)个字节来存放对象的个数,或者说数组的大小。

2)        使用方法第二步中的new才是placement new,其实是没有申请内存的,只是调用了构造函数,返回一个指向已经分配好的内存的一个指针,所以对象销毁的时候不需要调用delete释放空间,但必须调用析构函数销毁对象。

-----------------------------------------------

时间: 2024-10-25 09:53:08

placement new操作符的相关文章

placement new 操作符

placement new操作符能够在分配内存时指定内存位置.下面的程序使用了placement new操作符和常规new操作符给对象分配内存. // placenew.cpp -- new, placement new, no delete #include <iostream> #include <string> #include <new> using namespace std; const int BUF = 512; class JustTesting {

C++中placement new操作符(经典)

参见下面两个博客 1. http://blog.csdn.net/zhangxinrun/article/details/5940019 placement new是重载operator new的一个标准.全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本). 它的原型如下: void *operator new( size_t, void *p ) throw()  { return p; } 首先我们区分下几个

c++中的placement new操作符学习

参考文献:http://blog.csdn.net/zhangxinrun/article/details/5940019 new操作符: 例子如下:int * pint=new int(23):它先在堆上分配内存空间:接着初始化这个内存空间:最后返回此指针. 对于此操作是可以重载的,记住是只能在类中被重载,得到了一个重载版本为placement new (旧版本是operator new),原型如下void *operator new( size_t, void *p ) throw()  {

C++ 中 new 操作符内幕:new operator、operator new、placement new

原文链接 一.new 操作符(new operator) 人们有时好像喜欢有益使C++语言的术语难以理解.比方说new操作符(new operator)和operator new的差别. 当你写这种代码: string *ps = new string("Memory Management"); 你使用的new是new操作符. 这个操作符就象sizeof一样是语言内置的.你不能改变它的含义,它的功能总是一样的.它要完毕的功能分成两部分.第一部分是分配足够的内存以便容纳所需类型的对象.

c++ placement new概念

参考:http://www.cnblogs.com/Clingingboy/archive/2013/04/26/3044910.html 转:http://bbs.chinaunix.net/thread-1015707-1-1.html 问题:什么是“定位放置new(placement new)”,为什么要用它 ? 定位放置new(placement new)有很多作用.最简单的用处就是将对象 放置在内存中的特殊位置.这是依靠 new表达式部分的指针参数的位置来完成的: #include <

placement new的使用及好处

详细的介绍可以看这几篇文章: C++中placement new操作符(经典) Placement new的用法及用途 (转)遵循placement new的用法规范 归纳一下placement new的好处: 在已分配好的内存上进行对象的构建,构建速度快. 可以反复利用同一块已分配好的内存,有效的避免内存碎片问题. 建立对象数组时,能够调用带参数的构造函数. placement new的使用及好处

【转载】C++内存分配

原文:C++内存分配 内存泄露相信对C++程序员来说都不陌生.解决内存泄露的方案多种多样,大部分方案以追踪检测为主,这种方法实现起来容易,使用方便,也比较安全. 首先我们要确定这个模块的主要功能: 能追踪内存的分配和释放过程. 要能显示内存分配的相关信息,比如内存块大小,代码所在文件所在行等. 在发现内存泄露时及时给出相关信息. 能正确处理一些异常情况,比如内存不足,对象初始化失败等等. 是线程安全的.[*这个还没有实现] 有了一些基本功能需求,我们需要考虑每种功能怎么去实现.首先,我们可以通过

一个跨平台的 C++ 内存泄漏检测器

2004 年 3 月 01 日 内存泄漏对于C/C++程序员来说也可以算作是个永恒的话题了吧.在Windows下,MFC的一个很有用的功能就是能在程序运行结束时报告是否发生了内存泄漏.在Linux下,相对来说就没有那么容易使用的解决方案了:像mpatrol之类的现有工具,易用性.附加开销和性能都不是很理想.本文实现一个极易于使用.跨平台的C++内存泄漏检测器.并对相关的技术问题作一下探讨. 基本使用 对于下面这样的一个简单程序test.cpp: int main() { int* p1 = ne

Python爬取CSDN博客文章

之前解析出问题,刚刚看到,这次仔细审查了 0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.windows下环境搭建 3.java里连接redis数据库 4.关于认证 5.redis高级功能总结1.基础底层数据结构1.1.简单动态字符串SDS定义: ...47分钟前1 url :http://blog.csdn.net/youyou1543724847/