﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-知耻而后勇-随笔分类-C++</title><link>http://www.cppblog.com/keycw88/category/17799.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 20 Sep 2011 06:00:20 GMT</lastBuildDate><pubDate>Tue, 20 Sep 2011 06:00:20 GMT</pubDate><ttl>60</ttl><item><title>placement new, operator new and new operator[ZZ]</title><link>http://www.cppblog.com/keycw88/archive/2011/09/20/156301.html</link><dc:creator>chuwei</dc:creator><author>chuwei</author><pubDate>Tue, 20 Sep 2011 05:12:00 GMT</pubDate><guid>http://www.cppblog.com/keycw88/archive/2011/09/20/156301.html</guid><wfw:comment>http://www.cppblog.com/keycw88/comments/156301.html</wfw:comment><comments>http://www.cppblog.com/keycw88/archive/2011/09/20/156301.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/keycw88/comments/commentRss/156301.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/keycw88/services/trackbacks/156301.html</trackback:ping><description><![CDATA[<div><div>转自：http://www.cnblogs.com/swpattern/archive/2010/05/11/1732352.html<br />   <div><div id="cnblogs_post_body"><p>笔者觉得这3个new有点意思，有时候我也被搞懵了，这些创造者难不成觉得C++过于简单，所以搞一点含糊的术语出来。这次总结一下，以便再懵的时候有个参考。有错的地方请不吝赐教，多谢先！</p> <p>简单点吧:</p> <p>1. new operator，即熟悉的new操作符，用它从堆中分配一个对象，并且初始化。CHeapObject* p=new CHeapObject(name);</p> <p>既然是操作符，那么它的行为就和其他+-*/操作符一样，是由C++语言定义的，不能改变，即使通过重载的方式也不能改变。C++规定了new操作符的行为：分配一个合适的空间容纳CHeapObject对象，然后调用其构造函数初始化对象。</p> <p>2. operator new，就是new操作，1种说的&#8220;<em><span style="color: #ff0000;">分配一个合适的空间容纳CHeapObject对象</span></em>&#8221;就是通过new操作完成的。全局的new操作是如下声明的：</p> <p>void * operator new(size_t size);</p> <p>这是一个函数声明，在Ｃ＋＋里我们可以通过重载该函数改变这个函数的行为，即分配空间的方式，相信大家都干过这事。</p> <p>补充一下，虽然operator new是给new operator调用的，但是也可以被你调用，如：</p> <p>void* p=operator new(sizeof(CHeapObject));</p> <p>它只分配空间，等同于C里的malloc()。</p> <p>虽然我们重载了operator new，但是我们没有改变1中new operator的行为。</p> <p>3. placement new</p> <p>唉，我又懵了:-)</p> <p>这是在已经分配好的空间上(比如malloc, operatornew,返回的void*，没有对象信息)，调用CHeapObject的对象构造函数，这也是一个特殊的new操作。上例子吧：</p> <p>void* buffer=operator new(100*sizeof(CHeapObject));///分配100个对象的空间</p> <p>CHeapObject* construct(void* buf, string objname)</p> <p>{</p> <p>&nbsp; return new(buf) CHeapObject(objname);</p> <p>}</p> <p>这个函数返回对象指针，对象是在传递进来的buffer上分配。这个new的用法是new操作符的另一个用法，需要一个额外的变量buf，new操作的隐含调用operator new的时候会把buf传递给它，这是operator new的定义如下：</p> <p>void * operator new(size_t, void *buffer)</p> <p>{</p> <p>&nbsp; return buffer;</p> <p>}</p> <p>这就是placement new。</p> <p>最后来个总结吧：</p> <p>如果想在堆上创建一个对象，应该用new操作符，它分配内存，同时又为对象调用构造函数。</p> <p>如果仅仅想分配内存，就用operator new函数，它不会调用构造函数。</p> <p>如果你想定制自己的在堆对象被建立时的内存分配过程，应该重载写你自己的operator new函数，new操作符会调用你定制的operator new。</p> <p>如果想在一块已经分配好的内存里建立一个对象，使用placement new。</p></div></div>   <br /> </div> </div><img src ="http://www.cppblog.com/keycw88/aggbug/156301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/keycw88/" target="_blank">chuwei</a> 2011-09-20 13:12 <a href="http://www.cppblog.com/keycw88/archive/2011/09/20/156301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>