<dl id="opymh"></dl>

<div id="opymh"></div>
      <div id="opymh"><tr id="opymh"></tr></div>

        <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

        <em id="opymh"></em>

        <em id="opymh"><ol id="opymh"></ol></em>

              频道栏目
              首页 > 程序开发 > 软件开发 > C++ > 正文
              关于C++中new¡¢operator new和placement new的区别详解
              2018-07-27 16:53:12         来源£º哆啦A瑶的博客  
              收藏   我要投稿

              new和delete操作符我们应该都用过£¬它们是对堆中的内存进行申请和释放£¬而这两个都是不能被重载的¡£要实现不同的内存分配行为£¬需要重载operator new£¬而不是new和delete¡£

              看如下代码£º

              class MyClass {…};

              MyClass * p=new MyClass;

              这里的new实际上是执行如下3个过程£º

              1调用operator new分配内存£»

              2调用构造函数生成类对象£»

              3返回相应指针¡£

              operator new就像operator+一样£¬是可以重载的£¬但是不能在全局对原型为void operator new(size_t size)这个原型进行重载£¬一般只能在类中进行重载¡£如果类中没有重载operator new£¬那么调用的就是全局的::operator new来完成堆的分配¡£同理£¬operator new[]¡¢operator delete¡¢operator delete[]也是可以重载的£¬一般你重载了其中一个£¬那么最好把其余三个都重载一遍¡£

              placement 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. 对象的销毁

              一旦这个对象使用完?#24076;?#20320;必须?#20801;?#30340;调用类的析构函数进行销毁对象¡£但此时内存空间不会被释放£¬以便其他的对象的构造¡£

              pClass->~MyClass();

              4. 内存的释放

              如果缓冲区在堆中£¬那么调用delete[] buf;进行内存的释放£»如果在栈中£¬那么在其作用域内?#34892;§£?#36339;出作用域£¬内存自动释放¡£

              点击复制链接 与好友分享!回本站首页
              上一篇£ºC++基本语言-字符串string¡¢向量vector和数组实例介绍
              下一篇£ºC++关于左值£¬右值£¬左值引用£¬右值引用£¬std::move, std::foward等知识讲解
              相关文章
              图文推荐
              点击排行

              关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

              版权所有: 红黑联盟--致力于做实用的IT技术学习网站

              ¼«ËÙ·ÉͧºÃ¼Ù
              <dl id="opymh"></dl>

              <div id="opymh"></div>
                  <div id="opymh"><tr id="opymh"></tr></div>

                    <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

                    <em id="opymh"></em>

                    <em id="opymh"><ol id="opymh"></ol></em>

                          <dl id="opymh"></dl>

                          <div id="opymh"></div>
                              <div id="opymh"><tr id="opymh"></tr></div>

                                <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

                                <em id="opymh"></em>

                                <em id="opymh"><ol id="opymh"></ol></em>