<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>wildpointer&#039;s blog</title>
	<atom:link href="http://wildpointer.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://wildpointer.net</link>
	<description>方向比努力重要，能力比知识重要，健康比成绩重要，生活比文凭重要，情商比智商重要</description>
	<lastBuildDate>Tue, 17 Jan 2012 09:50:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>0和NULL的区别</title>
		<link>http://wildpointer.net/2012/01/17/difference_0_null/</link>
		<comments>http://wildpointer.net/2012/01/17/difference_0_null/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 09:28:10 +0000</pubDate>
		<dc:creator>wildpointer</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://wildpointer.net/?p=1142</guid>
		<description><![CDATA[在C/C++语言中，NULL是个宏。 在我的Windows机器上的stddef.h中，有如下的宏定义： 1 2 3 4 5 6 7 8 /* Define NULL pointer value */ #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif 在我的Linux虚拟机中的stddef.h中，有差不多的定义。 以上定义说明：在C++语言中，NULL是int型的0；在C++语言中，NULL是void *类型的0。表面上是这样，事实却不同。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [...]]]></description>
			<content:encoded><![CDATA[<p>在C/C++语言中，NULL是个宏。</p>
<p>在我的Windows机器上的stddef.h中，有如下的宏定义：</p>

<div class="wp_codebox"><table><tr id="p11424"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p1142code4"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/* Define NULL pointer value */</span>
<span style="color: #339933;">#ifndef NULL</span>
<span style="color: #339933;">#ifdef __cplusplus</span>
<span style="color: #339933;">#define NULL    0</span>
<span style="color: #339933;">#else</span>
<span style="color: #339933;">#define NULL    ((void *)0)</span>
<span style="color: #339933;">#endif</span>
<span style="color: #339933;">#endif</span></pre></td></tr></table></div>

<p>在我的Linux虚拟机中的stddef.h中，有差不多的定义。</p>
<p>以上定义说明：在C++语言中，NULL是int型的0；在C++语言中，NULL是void *类型的0。表面上是这样，事实却不同。</p>

<div class="wp_codebox"><table><tr id="p11425"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code" id="p1142code5"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdarg.h&gt;</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">void</span> read_string_from_va<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> ...<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
&nbsp;
	va_list arg_ptr<span style="color: #339933;">;</span>
	va_start<span style="color: #009900;">&#40;</span>arg_ptr<span style="color: #339933;">,</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">=</span> va_arg<span style="color: #009900;">&#40;</span>arg_ptr<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> NULL<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	va_end<span style="color: #009900;">&#40;</span>arg_ptr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	read_string_from_va<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">10</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;4&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;5&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;6&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;7&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;8&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>上面的代码在VS2010中编译运行(不论是64bit还是32bit,不论是Debug,还是release)，都没问题。</p>
<p>但用64位的gcc/g++在64位的Linux上编译运行，会有segmentation fault. 有图为证：</p>
<p><a href="http://wildpointer.net/wp-content/uploads/2012/01/0null.jpg"><img class="aligncenter size-full wp-image-1147" title="0null" src="http://wildpointer.net/wp-content/uploads/2012/01/0null.jpg" alt="" width="499" height="684" /></a><br />
我们看到，不管你把它当C代码编译，还是当然C++代码编译，运行时都会segmentation fault.<br />
原因很简单： 0是int，而read_string_from_va()中取值的时候，把它当char *。在64bit的linux上，char *是8字节长，int是4字节长，存进去4字节却取出8字节，所以最后挂了。<br />
对于Linux C，换成NULL就不挂了，道理很简单，在C中，NULL是指针，你存进去8字节，拿出来8字节，一切OK。<br />
按理来说，对于Linux C++，换成NULL一样挂，因为在C++中，NULL是int型的0，但事实并非如此：<br />
<a href="http://wildpointer.net/wp-content/uploads/2012/01/0null1.jpg"><img src="http://wildpointer.net/wp-content/uploads/2012/01/0null1.jpg" alt="" title="0null1" width="521" height="527" class="aligncenter size-full wp-image-1150" /></a><br />
很诡异，在C++中，0就是NULL，这次为什么没挂呢？g++做了什么事？<br />
如果运行</p>

<div class="wp_codebox"><table><tr id="p11426"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1142code6"><pre class="c" style="font-family:monospace;">g<span style="color: #339933;">++</span> <span style="color: #339933;">-</span>E test0NULLL.<span style="color: #202020;">c</span></pre></td></tr></table></div>

<p>我们可以看到，g++把NULL换成了__null，也就是g++自己的一个东西。然后再看看sizeof(__null)，是8，所以没挂。<br />
看来stddef.h中的宏没起作用。</p>
<p>还有问题：<br />
	read_string_from_va(10, &#8220;4&#8243;, &#8220;5&#8243;, &#8220;6&#8243;, &#8220;7&#8243;, 0);<br />
上面的代码会挂吗？为什么？这和64bit linux calling convention有关。<br />
为什么windows上vs2010没挂？vs2010聪明还是gcc/g++更相信程序员还是什么其它的？以后再说。</p>
]]></content:encoded>
			<wfw:commentRss>http://wildpointer.net/2012/01/17/difference_0_null/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>欲望的层次</title>
		<link>http://wildpointer.net/2012/01/07/level_of_desire/</link>
		<comments>http://wildpointer.net/2012/01/07/level_of_desire/#comments</comments>
		<pubDate>Sat, 07 Jan 2012 06:11:23 +0000</pubDate>
		<dc:creator>wildpointer</dc:creator>
				<category><![CDATA[活着]]></category>

		<guid isPermaLink="false">http://wildpointer.net/?p=1140</guid>
		<description><![CDATA[今天看到有人在水木上发帖：发帖人刚怀孕，但这是二胎，自己和工作在体制内，没办法再要了，要打掉，很伤感。 鱼和熊掌不可得兼，舍鱼而取熊掌者也。 孩子和体制内的工作，二者不可得兼，舍孩子而取工作者也。 有些人，为了鱼和熊掌不能兼得而伤感； 有些人，嫌鱼和熊掌太小而伤感； 有些人，因为没鱼也没熊掌而伤感。]]></description>
			<content:encoded><![CDATA[<p>今天看到有人在水木上发帖：发帖人刚怀孕，但这是二胎，自己和工作在体制内，没办法再要了，要打掉，很伤感。<br />
鱼和熊掌不可得兼，舍鱼而取熊掌者也。<br />
孩子和体制内的工作，二者不可得兼，舍孩子而取工作者也。</p>
<p>有些人，为了鱼和熊掌不能兼得而伤感；<br />
有些人，嫌鱼和熊掌太小而伤感；<br />
有些人，因为没鱼也没熊掌而伤感。</p>
]]></content:encoded>
			<wfw:commentRss>http://wildpointer.net/2012/01/07/level_of_desire/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>一个练手的程序</title>
		<link>http://wildpointer.net/2011/12/12/1136/</link>
		<comments>http://wildpointer.net/2011/12/12/1136/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 01:47:32 +0000</pubDate>
		<dc:creator>wildpointer</dc:creator>
				<category><![CDATA[C/C++]]></category>

		<guid isPermaLink="false">http://wildpointer.net/?p=1136</guid>
		<description><![CDATA[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 [...]]]></description>
			<content:encoded><![CDATA[
<div class="wp_codebox"><table><tr id="p11368"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
</pre></td><td class="code" id="p1136code8"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">typedef</span> <span style="color: #000000; font-weight: bold;">enum</span> color_e
<span style="color: #009900;">&#123;</span>
    RED<span style="color: #339933;">,</span>
    WHITE<span style="color: #339933;">,</span>
    BLUE<span style="color: #339933;">,</span>
<span style="color: #009900;">&#125;</span> color_t<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> __partition<span style="color: #009900;">&#40;</span>color_t arr<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span> _start<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> _end<span style="color: #339933;">,</span> color_t c<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> start <span style="color: #339933;">=</span> _start<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> end <span style="color: #339933;">=</span> _end<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>start <span style="color: #339933;">&lt;</span> end<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>start <span style="color: #339933;">&lt;=</span> end <span style="color: #339933;">&amp;&amp;</span> arr<span style="color: #009900;">&#91;</span>start<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> c<span style="color: #009900;">&#41;</span> start<span style="color: #339933;">++;</span>
        <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>start <span style="color: #339933;">&lt;=</span> end <span style="color: #339933;">&amp;&amp;</span> arr<span style="color: #009900;">&#91;</span>end<span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> c<span style="color: #009900;">&#41;</span> end<span style="color: #339933;">--;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>start<span style="color: #339933;">&lt;</span>end<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            color_t tmp <span style="color: #339933;">=</span> arr<span style="color: #009900;">&#91;</span>start<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            arr<span style="color: #009900;">&#91;</span>start<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> arr<span style="color: #009900;">&#91;</span>end<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            arr<span style="color: #009900;">&#91;</span>end<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> tmp<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> start<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> partition<span style="color: #009900;">&#40;</span>color_t arr<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    __partition<span style="color: #009900;">&#40;</span>arr<span style="color: #339933;">,</span> __partition<span style="color: #009900;">&#40;</span>arr<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> n <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> WHITE<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> n <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> BLUE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
bool check<span style="color: #009900;">&#40;</span>color_t arr<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">&lt;</span> n <span style="color: #339933;">&amp;&amp;</span> arr<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> WHITE<span style="color: #009900;">&#41;</span> i<span style="color: #339933;">++;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">&lt;</span> n <span style="color: #339933;">&amp;&amp;</span> arr<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> BLUE<span style="color: #009900;">&#41;</span> i<span style="color: #339933;">++;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">&lt;</span> n <span style="color: #339933;">&amp;&amp;</span> arr<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> RED<span style="color: #009900;">&#41;</span> i<span style="color: #339933;">++;</span>
&nbsp;
    assert<span style="color: #009900;">&#40;</span>i <span style="color: #339933;">==</span> n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> i <span style="color: #339933;">==</span> n<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> init<span style="color: #009900;">&#40;</span>color_t arr<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    color_t tmp_arr<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>WHITE<span style="color: #339933;">,</span> BLUE<span style="color: #339933;">,</span> RED<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">&lt;</span> n<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        arr<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> tmp_arr<span style="color: #009900;">&#91;</span>rand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">%</span><span style="color:#800080;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        i<span style="color: #339933;">++;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    srand<span style="color: #009900;">&#40;</span>time<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">100000</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        color_t <span style="color: #339933;">*</span> arr <span style="color: #339933;">=</span> new color_t<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        init<span style="color: #009900;">&#40;</span>arr<span style="color: #339933;">,</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        partition<span style="color: #009900;">&#40;</span>arr<span style="color: #339933;">,</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>check<span style="color: #009900;">&#40;</span>arr<span style="color: #339933;">,</span> i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;===================%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        delete <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span>arr<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>一个练手的程序，关键是快排中的partition。<br />
一个数组中有红白蓝三种颜色，用线性的方法把这三种颜色分开。<br />
我觉得直接调用qsort也肯定是线性的。<br />
还可以统计一下三种颜色的数量，这样更简单，没啥意思。</p>
]]></content:encoded>
			<wfw:commentRss>http://wildpointer.net/2011/12/12/1136/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>This is a test</title>
		<link>http://wildpointer.net/2011/11/29/bing-liu-test/</link>
		<comments>http://wildpointer.net/2011/11/29/bing-liu-test/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 14:30:27 +0000</pubDate>
		<dc:creator>wildpointer</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://wildpointer.net/?p=1125</guid>
		<description><![CDATA[Teach Bing Liu. 先在1号圈圈里写标题。之后会自动生成地址。 可以点击2号圈圈改地址。 点击3号圈圈。 4号圈圈中的东西可以上传图片、音乐、视频。 5号圈圈中的东西就像word一样。 6号圈圈可以让你把word文档直接贴进来。 7号圈圈可以用来加链接，一会儿你做好了第个网页再用。 8号圈圈让你发布，点了它之后，你就可以在www.wildpointer.net看到你的帖子了。]]></description>
			<content:encoded><![CDATA[<p>Teach Bing Liu.</p>
<p><a href="http://wildpointer.net/wp-content/uploads/2011/11/teach_BL1.gif"><img class="aligncenter size-full wp-image-1128" title="teach_BL" src="http://wildpointer.net/wp-content/uploads/2011/11/teach_BL1.gif" alt="" width="1254" height="522" /></a></p>
<p>先在1号圈圈里写标题。之后会自动生成地址。<br />
可以点击2号圈圈改地址。<br />
点击3号圈圈。<br />
4号圈圈中的东西可以上传图片、音乐、视频。<br />
5号圈圈中的东西就像word一样。<br />
6号圈圈可以让你把word文档直接贴进来。<br />
7号圈圈可以用来加链接，一会儿你做好了第个网页再用。<br />
8号圈圈让你发布，点了它之后，你就可以在www.wildpointer.net看到你的帖子了。</p>
]]></content:encoded>
			<wfw:commentRss>http://wildpointer.net/2011/11/29/bing-liu-test/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>螺旋数组</title>
		<link>http://wildpointer.net/2011/11/07/rotate_array/</link>
		<comments>http://wildpointer.net/2011/11/07/rotate_array/#comments</comments>
		<pubDate>Mon, 07 Nov 2011 11:28:38 +0000</pubDate>
		<dc:creator>wildpointer</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://wildpointer.net/?p=1118</guid>
		<description><![CDATA[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 [...]]]></description>
			<content:encoded><![CDATA[
<div class="wp_codebox"><table><tr id="p111810"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
</pre></td><td class="code" id="p1118code10"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define INDEX(total, x, y) ((x)*(total*2)+(y))</span>
&nbsp;
<span style="color: #993333;">void</span> fill<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>matrix<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> total<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> value<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>value <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        matrix<span style="color: #009900;">&#91;</span>INDEX<span style="color: #009900;">&#40;</span>total<span style="color: #339933;">,</span> total<span style="color: #339933;">,</span> total<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #993333;">int</span> x_top <span style="color: #339933;">=</span> total <span style="color: #339933;">-</span> value<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> y_left <span style="color: #339933;">=</span> x_top<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> x_bottom <span style="color: #339933;">=</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">*</span>total <span style="color: #339933;">-</span> x_top<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> y_right <span style="color: #339933;">=</span> x_bottom<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #993333;">int</span> x <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> y <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//(x_top, y_left) ---------&gt; (x_top, y_right)           y changes</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> x<span style="color: #339933;">=</span>x_top<span style="color: #339933;">,</span> y<span style="color: #339933;">=</span>y_left<span style="color: #339933;">;</span> y<span style="color: #339933;">&lt;</span>y_right<span style="color: #339933;">;</span> y<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        matrix<span style="color: #009900;">&#91;</span>INDEX<span style="color: #009900;">&#40;</span>total<span style="color: #339933;">,</span> x<span style="color: #339933;">,</span> y<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> value<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//(x_top,y_right) ---------&gt; (x_bottom, y_right)        x changes</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> x<span style="color: #339933;">=</span>x_top<span style="color: #339933;">,</span> y<span style="color: #339933;">=</span>y_right<span style="color: #339933;">;</span> x<span style="color: #339933;">&lt;</span>x_bottom<span style="color: #339933;">;</span> x<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        matrix<span style="color: #009900;">&#91;</span>INDEX<span style="color: #009900;">&#40;</span>total<span style="color: #339933;">,</span> x<span style="color: #339933;">,</span> y<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> value<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//(x_bottom, y_right) -----&gt; (x_bottom, y_left)         y changes</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> x<span style="color: #339933;">=</span>x_bottom<span style="color: #339933;">,</span> y<span style="color: #339933;">=</span>y_right<span style="color: #339933;">;</span> y<span style="color: #339933;">&gt;</span>y_left<span style="color: #339933;">;</span> y<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
        matrix<span style="color: #009900;">&#91;</span>INDEX<span style="color: #009900;">&#40;</span>total<span style="color: #339933;">,</span> x<span style="color: #339933;">,</span> y<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> value<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//(x_bottom, y_left) ------&gt; (x_top, y_left)            x changes</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> x<span style="color: #339933;">=</span>x_bottom<span style="color: #339933;">,</span> y<span style="color: #339933;">=</span>y_left<span style="color: #339933;">;</span> x<span style="color: #339933;">&gt;</span>x_top<span style="color: #339933;">;</span> x<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
        matrix<span style="color: #009900;">&#91;</span>INDEX<span style="color: #009900;">&#40;</span>total<span style="color: #339933;">,</span> x<span style="color: #339933;">,</span> y<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> value<span style="color: #339933;">;</span>
&nbsp;
    fill<span style="color: #009900;">&#40;</span>matrix<span style="color: #339933;">,</span> total<span style="color: #339933;">,</span> value <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> fill1<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>matrix<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> total<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> value<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
BEGIN<span style="color: #339933;">:</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>value <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        matrix<span style="color: #009900;">&#91;</span>INDEX<span style="color: #009900;">&#40;</span>total<span style="color: #339933;">,</span> total<span style="color: #339933;">,</span> total<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #993333;">int</span> x_top <span style="color: #339933;">=</span> total <span style="color: #339933;">-</span> value<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> y_left <span style="color: #339933;">=</span> x_top<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> x_bottom <span style="color: #339933;">=</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">*</span>total <span style="color: #339933;">-</span> x_top<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> y_right <span style="color: #339933;">=</span> x_bottom<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #993333;">int</span> x <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> y <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//(x_top, y_left) ---------&gt; (x_top, y_right)           y changes</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> x<span style="color: #339933;">=</span>x_top<span style="color: #339933;">,</span> y<span style="color: #339933;">=</span>y_left<span style="color: #339933;">;</span> y<span style="color: #339933;">&lt;</span>y_right<span style="color: #339933;">;</span> y<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        matrix<span style="color: #009900;">&#91;</span>INDEX<span style="color: #009900;">&#40;</span>total<span style="color: #339933;">,</span> x<span style="color: #339933;">,</span> y<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> value<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//(x_top,y_right) ---------&gt; (x_bottom, y_right)        x changes</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> x<span style="color: #339933;">=</span>x_top<span style="color: #339933;">,</span> y<span style="color: #339933;">=</span>y_right<span style="color: #339933;">;</span> x<span style="color: #339933;">&lt;</span>x_bottom<span style="color: #339933;">;</span> x<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        matrix<span style="color: #009900;">&#91;</span>INDEX<span style="color: #009900;">&#40;</span>total<span style="color: #339933;">,</span> x<span style="color: #339933;">,</span> y<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> value<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//(x_bottom, y_right) -----&gt; (x_bottom, y_left)         y changes</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> x<span style="color: #339933;">=</span>x_bottom<span style="color: #339933;">,</span> y<span style="color: #339933;">=</span>y_right<span style="color: #339933;">;</span> y<span style="color: #339933;">&gt;</span>y_left<span style="color: #339933;">;</span> y<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
        matrix<span style="color: #009900;">&#91;</span>INDEX<span style="color: #009900;">&#40;</span>total<span style="color: #339933;">,</span> x<span style="color: #339933;">,</span> y<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> value<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//(x_bottom, y_left) ------&gt; (x_top, y_left)            x changes</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> x<span style="color: #339933;">=</span>x_bottom<span style="color: #339933;">,</span> y<span style="color: #339933;">=</span>y_left<span style="color: #339933;">;</span> x<span style="color: #339933;">&gt;</span>x_top<span style="color: #339933;">;</span> x<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
        matrix<span style="color: #009900;">&#91;</span>INDEX<span style="color: #009900;">&#40;</span>total<span style="color: #339933;">,</span> x<span style="color: #339933;">,</span> y<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> value<span style="color: #339933;">;</span>
&nbsp;
    value <span style="color: #339933;">--;</span>
    <span style="color: #b1b100;">goto</span> BEGIN<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> print<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>matrix<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> total<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> x <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> y <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> width <span style="color: #339933;">=</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> x<span style="color: #339933;">&lt;=</span>total<span style="color: #339933;">*</span><span style="color: #0000dd;">2</span><span style="color: #339933;">;</span> x<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>y<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> y<span style="color: #339933;">&lt;=</span>total<span style="color: #339933;">*</span><span style="color: #0000dd;">2</span><span style="color: #339933;">;</span> y<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
            <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">,</span> matrix<span style="color: #009900;">&#91;</span>INDEX<span style="color: #009900;">&#40;</span>total<span style="color: #339933;">,</span> x<span style="color: #339933;">,</span> y<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> total <span style="color: #339933;">=</span> atoi<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> <span style="color: #339933;">*</span>matrix <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> malloc <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>total<span style="color: #339933;">*</span><span style="color: #0000dd;">2</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>total<span style="color: #339933;">*</span><span style="color: #0000dd;">2</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>matrix <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span> 
    <span style="color: #009900;">&#123;</span>
        <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;error: malloc return NULL<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    fill1<span style="color: #009900;">&#40;</span>matrix<span style="color: #339933;">,</span> total<span style="color: #339933;">,</span> total<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    print<span style="color: #009900;">&#40;</span>matrix<span style="color: #339933;">,</span> total<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    free<span style="color: #009900;">&#40;</span>matrix<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>从http://www.latelee.org/my-library/156-concentric-matrix.html看到的，写写练练手。<br />
fill是递归的，尾递归，改成fill1，由于不想再格式化代码，用了个goto。如果很反对goto的话，可能看着很难受。<br />
代码中可以用goto，只要不是乱goto就可以。</p>
]]></content:encoded>
			<wfw:commentRss>http://wildpointer.net/2011/11/07/rotate_array/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>operator new的故事</title>
		<link>http://wildpointer.net/2011/11/06/operator-new/</link>
		<comments>http://wildpointer.net/2011/11/06/operator-new/#comments</comments>
		<pubDate>Sun, 06 Nov 2011 11:41:19 +0000</pubDate>
		<dc:creator>wildpointer</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://wildpointer.net/?p=1111</guid>
		<description><![CDATA[operator new是一组函数，当使用new operator申请内存并调用构造函数时会用到它，operator new函数就是用来申请内存的，差不多相当于malloc. operator delete也是一组函数，如果new operator调用operator new分配空间后，调用构造函数失败，则operator delete被C++运行环境调用来释放operator new申请到的空间，程序员不会手动直接调用这类函数。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 namespace std &#123; class bad_alloc; class bad_array_new_length; struct nothrow_t &#123;&#125;; extern const nothrow_t nothrow; typedef void &#40;*new_handler&#41;&#40;&#41;; new_handler get_new_handler&#40;&#41; noexcept; new_handler set_new_handler&#40;new_handler new_p&#41; noexcept; [...]]]></description>
			<content:encoded><![CDATA[<p>operator new是一组函数，当使用new operator申请内存并调用构造函数时会用到它，operator new函数就是用来申请内存的，差不多相当于malloc.<br />
operator delete也是一组函数，如果new operator调用operator new分配空间后，调用构造函数失败，则operator delete被C++运行环境调用来释放operator new申请到的空间，程序员不会手动直接调用这类函数。</p>

<div class="wp_codebox"><table><tr id="p111121"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code" id="p1111code21"><pre class="c" style="font-family:monospace;">namespace std <span style="color: #009900;">&#123;</span>
class bad_alloc<span style="color: #339933;">;</span>
class bad_array_new_length<span style="color: #339933;">;</span>
<span style="color: #993333;">struct</span> nothrow_t <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">extern</span> <span style="color: #993333;">const</span> nothrow_t nothrow<span style="color: #339933;">;</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">void</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>new_handler<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
new_handler get_new_handler<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span>
new_handler set_new_handler<span style="color: #009900;">&#40;</span>new_handler new_p<span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #993333;">void</span><span style="color: #339933;">*</span> operator new<span style="color: #009900;">&#40;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">size_t</span> size<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span><span style="color: #339933;">*</span> operator new<span style="color: #009900;">&#40;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">size_t</span> size<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> std<span style="color: #339933;">::</span><span style="color: #202020;">nothrow_t</span><span style="color: #339933;">&amp;</span><span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> operator delete<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #339933;">*</span> ptr<span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> operator delete<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #339933;">*</span> ptr<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> std<span style="color: #339933;">::</span><span style="color: #202020;">nothrow_t</span><span style="color: #339933;">&amp;</span><span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span>
<span style="color: #993333;">void</span><span style="color: #339933;">*</span> operator new<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">size_t</span> size<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span><span style="color: #339933;">*</span> operator new<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">size_t</span> size<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> std<span style="color: #339933;">::</span><span style="color: #202020;">nothrow_t</span><span style="color: #339933;">&amp;</span><span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> operator delete<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #339933;">*</span> ptr<span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> operator delete<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #339933;">*</span> ptr<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> std<span style="color: #339933;">::</span><span style="color: #202020;">nothrow_t</span><span style="color: #339933;">&amp;</span><span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span>
<span style="color: #993333;">void</span><span style="color: #339933;">*</span> operator new <span style="color: #009900;">&#40;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">size_t</span> size<span style="color: #339933;">,</span> <span style="color: #993333;">void</span><span style="color: #339933;">*</span> ptr<span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span>
<span style="color: #993333;">void</span><span style="color: #339933;">*</span> operator new<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">size_t</span> size<span style="color: #339933;">,</span> <span style="color: #993333;">void</span><span style="color: #339933;">*</span> ptr<span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> operator delete <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #339933;">*</span> ptr<span style="color: #339933;">,</span> <span style="color: #993333;">void</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> operator delete<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #339933;">*</span> ptr<span style="color: #339933;">,</span> <span style="color: #993333;">void</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>上面一组东西是C++标准规定的。<br />
在namespace std中，定义了bad_alloc，nothrow_t，以及new_handler类型和set_new_handler函数。<br />
第10、11行：</p>

<div class="wp_codebox"><table><tr id="p111122"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1111code22"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span><span style="color: #339933;">*</span> operator new<span style="color: #009900;">&#40;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">size_t</span> size<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span><span style="color: #339933;">*</span> operator new<span style="color: #009900;">&#40;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">size_t</span> size<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> std<span style="color: #339933;">::</span><span style="color: #202020;">nothrow_t</span><span style="color: #339933;">&amp;</span><span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>它用来分配size字节的空间。第一种形式如果分配空间失败，则抛出bad_alloc；第二种形式，如果分配失败了，则返回NULL，不抛出bad_alloc.</p>

<div class="wp_codebox"><table><tr id="p111123"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1111code23"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> operator delete<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #339933;">*</span> ptr<span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> operator delete<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #339933;">*</span> ptr<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> std<span style="color: #339933;">::</span><span style="color: #202020;">nothrow_t</span><span style="color: #339933;">&amp;</span><span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>上面两种operator delete，分别对应第11、12行两种operator new。</p>

<div class="wp_codebox"><table><tr id="p111124"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1111code24"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span><span style="color: #339933;">*</span> operator new<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">size_t</span> size<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span><span style="color: #339933;">*</span> operator new<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">size_t</span> size<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> std<span style="color: #339933;">::</span><span style="color: #202020;">nothrow_t</span><span style="color: #339933;">&amp;</span><span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>上面两种operator new[]，用来为数组分配空间，它们的区别与第11、12行的operator new的区别类似。</p>

<div class="wp_codebox"><table><tr id="p111125"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1111code25"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span><span style="color: #339933;">*</span> operator new <span style="color: #009900;">&#40;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">size_t</span> size<span style="color: #339933;">,</span> <span style="color: #993333;">void</span><span style="color: #339933;">*</span> ptr<span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span>
<span style="color: #993333;">void</span><span style="color: #339933;">*</span> operator new<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">size_t</span> size<span style="color: #339933;">,</span> <span style="color: #993333;">void</span><span style="color: #339933;">*</span> ptr<span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>上面两种，是最普通的placement new，它们仅仅返回ptr，不做其它事情。</p>

<div class="wp_codebox"><table><tr id="p111126"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1111code26"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> operator delete <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #339933;">*</span> ptr<span style="color: #339933;">,</span> <span style="color: #993333;">void</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> operator delete<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #339933;">*</span> ptr<span style="color: #339933;">,</span> <span style="color: #993333;">void</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> noexcept<span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>上面两种placement delete，什么都不做，只是与placement new对应，很诡异。</p>
<p>分配程序，使用VS2010,</p>

<div class="wp_codebox"><table><tr id="p111127"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p1111code27"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> _tmain<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> _TCHAR<span style="color: #339933;">*</span> argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> new <span style="color: #993333;">int</span><span style="color: #339933;">;</span>
    <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    delete p<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>单步跟踪会发现new调用了下面的operator new</p>

<div class="wp_codebox"><table><tr id="p111128"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p1111code28"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>__CRTDECL operator new<span style="color: #009900;">&#40;</span>size_t size<span style="color: #009900;">&#41;</span> _THROW1<span style="color: #009900;">&#40;</span>_STD bad_alloc<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>       <span style="color: #666666; font-style: italic;">// try to allocate size bytes</span>
        <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
        <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">=</span> malloc<span style="color: #009900;">&#40;</span>size<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>_callnewh<span style="color: #009900;">&#40;</span>size<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>       <span style="color: #666666; font-style: italic;">// report no memory</span>
                <span style="color: #993333;">static</span> <span style="color: #993333;">const</span> std<span style="color: #339933;">::</span><span style="color: #202020;">bad_alloc</span> nomem<span style="color: #339933;">;</span>
                _RAISE<span style="color: #009900;">&#40;</span>nomem<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>可以看出来，这个版本的operator new调用了malloc分配空间，如果分配成功，则返回指向分配的空间的指针，如果分配失败，且_callnewh(size)返回0，则抛出异常。对于上面的例子，不会失败。</p>
<p>再构造一个分配内存失败的例子，我们可以看到_callnewh()被调用：</p>

<div class="wp_codebox"><table><tr id="p111129"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p1111code29"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> _tmain<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> _TCHAR<span style="color: #339933;">*</span> argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">;;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #993333;">int</span> <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> new <span style="color: #993333;">int</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1024</span><span style="color: #339933;">*</span><span style="color: #0000dd;">1024</span><span style="color: #339933;">*</span><span style="color: #0000dd;">255</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>还是单步运行，在第二次new的时候，malloc失败，调用了_callnewh()。</p>

<div class="wp_codebox"><table><tr id="p111130"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p1111code30"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/* pointer to old-style C++ new handler */</span>
_PNH _pnhHeap<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">extern</span> <span style="color: #ff0000;">&quot;C&quot;</span> <span style="color: #993333;">int</span> __cdecl _callnewh<span style="color: #009900;">&#40;</span>size_t size<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        <span style="color: #009900;">&#123;</span>
            _PNH pnh <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>_PNH<span style="color: #009900;">&#41;</span> DecodePointer<span style="color: #009900;">&#40;</span>_pnhHeap<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span>pnh <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>pnh<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>size<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>_callnewh的函数体如上：如果new_handler是NULL或者(*pnh)(size) == 0则返回0。我不懂第二个表达式的意思。这次运行我观察到new_handler为NULL，直接就返回0了，然后抛出了异常。</p>
]]></content:encoded>
			<wfw:commentRss>http://wildpointer.net/2011/11/06/operator-new/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>new的故事</title>
		<link>http://wildpointer.net/2011/10/30/new_story/</link>
		<comments>http://wildpointer.net/2011/10/30/new_story/#comments</comments>
		<pubDate>Sun, 30 Oct 2011 12:36:19 +0000</pubDate>
		<dc:creator>wildpointer</dc:creator>
				<category><![CDATA[C/C++]]></category>

		<guid isPermaLink="false">http://wildpointer.net/?p=1103</guid>
		<description><![CDATA[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 [...]]]></description>
			<content:encoded><![CDATA[
<div class="wp_codebox"><table><tr id="p110332"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
</pre></td><td class="code" id="p1103code32"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;iostream&gt;</span>
<span style="color: #339933;">#include &lt;new&gt;</span>
<span style="color: #339933;">#include &lt;cstdlib&gt;</span>
<span style="color: #339933;">#define __OUTPUT_FUNC_NAME__ std::cout &lt;&lt; __FUNCTION__ \
        &lt;&lt;&quot;\tthis =\t&quot; &lt;&lt; this &lt;&lt; std::endl;</span>
&nbsp;
class Foo
<span style="color: #009900;">&#123;</span>
public<span style="color: #339933;">:</span>
    Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        __OUTPUT_FUNC_NAME__
    <span style="color: #009900;">&#125;</span>
    virtual ~Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        __OUTPUT_FUNC_NAME__
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    Foo <span style="color: #339933;">*</span>psingle <span style="color: #339933;">=</span> new Foo<span style="color: #339933;">;</span>
    delete psingle<span style="color: #339933;">;</span>
&nbsp;
    std<span style="color: #339933;">::</span><a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> <span style="color: #339933;">&lt;&lt;</span> __LINE__ <span style="color: #339933;">&lt;&lt;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">endl</span><span style="color: #339933;">;</span>
    Foo <span style="color: #339933;">*</span>psingle_nothrow <span style="color: #339933;">=</span> new<span style="color: #009900;">&#40;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">nothrow</span><span style="color: #009900;">&#41;</span> Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    delete psingle_nothrow<span style="color: #339933;">;</span>
&nbsp;
    std<span style="color: #339933;">::</span><a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> <span style="color: #339933;">&lt;&lt;</span> __LINE__ <span style="color: #339933;">&lt;&lt;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">endl</span><span style="color: #339933;">;</span>
    Foo <span style="color: #339933;">*</span>parray <span style="color: #339933;">=</span> new Foo<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    delete<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> parray<span style="color: #339933;">;</span>
&nbsp;
    std<span style="color: #339933;">::</span><a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> <span style="color: #339933;">&lt;&lt;</span> __LINE__ <span style="color: #339933;">&lt;&lt;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">endl</span><span style="color: #339933;">;</span>
    Foo <span style="color: #339933;">*</span>parray_nothrow <span style="color: #339933;">=</span> new<span style="color: #009900;">&#40;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">nothrow</span><span style="color: #009900;">&#41;</span> Foo<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    delete<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> parray_nothrow<span style="color: #339933;">;</span>
&nbsp;
    std<span style="color: #339933;">::</span><a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> <span style="color: #339933;">&lt;&lt;</span> __LINE__ <span style="color: #339933;">&lt;&lt;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">endl</span><span style="color: #339933;">;</span>
    Foo <span style="color: #339933;">*</span>praw <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>Foo <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span> Foo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    new<span style="color: #009900;">&#40;</span>praw<span style="color: #009900;">&#41;</span> Foo<span style="color: #339933;">;</span>
    praw<span style="color: #339933;">-&gt;</span>~Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    free<span style="color: #009900;">&#40;</span>praw<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    std<span style="color: #339933;">::</span><a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> <span style="color: #339933;">&lt;&lt;</span> __LINE__ <span style="color: #339933;">&lt;&lt;</span>std<span style="color: #339933;">::</span><span style="color: #202020;">endl</span><span style="color: #339933;">;</span>
    Foo <span style="color: #339933;">*</span>praw_array <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>Foo <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>Foo<span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">5</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        new<span style="color: #009900;">&#40;</span>praw_array<span style="color: #339933;">+</span>i<span style="color: #009900;">&#41;</span>Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">5</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #009900;">&#40;</span>praw_array<span style="color: #339933;">+</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>~Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    free<span style="color: #009900;">&#40;</span>praw_array<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>上面这段代码可以用VS2010编译通过并运行。<br />
第7~18行，是一个类Foo，用来示例的。<br />
第22行，是普通的new, 创建单个的对象。如果new分配空间失败，则抛出异常。<br />
第23行，是普通的delete，销毁单个的对象。<br />
第26行，nothrow new，也就是说，当new分配空间失败时，只返回NULL,不会抛出异常。<br />
第30行，new了一个数组。<br />
第31行，将数组delete。<br />
第39行，placement new, 已经有空间了，不用new去分配空间，直接在已经存在的空间上调用构造函数。<br />
第40行，将其销毁。<br />
第44行，申请了一个数组。第45~49行，一个一个地placement new，第50~53行，一个一个地placement delete. 有人会问：为什么不用placement new[], 答：不会，请多指教。</p>
<p>通过以上代码，对new有了直观的认识。new首先会分配空间，然后在得到的空间上调用构造函数。<br />
怎么分配空间？用operator new函数。<br />
分配空间失败了怎么办？如果是普通形式的new,抛出异常；如果是nothrow形式的new，返回NULL。<br />
operator new函数有哪些？且听下回分解。</p>
]]></content:encoded>
			<wfw:commentRss>http://wildpointer.net/2011/10/30/new_story/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>入职两周</title>
		<link>http://wildpointer.net/2011/07/30/on-board-two-weeks/</link>
		<comments>http://wildpointer.net/2011/07/30/on-board-two-weeks/#comments</comments>
		<pubDate>Sat, 30 Jul 2011 06:59:09 +0000</pubDate>
		<dc:creator>wildpointer</dc:creator>
				<category><![CDATA[活着]]></category>

		<guid isPermaLink="false">http://wildpointer.net/?p=1096</guid>
		<description><![CDATA[十八号入职到现在，已经两周了。 这两周来，一直在接受培训。讲讲公司的制度等等。上周五，逛了逛上海，去了好几个地方，东方明珠、七宝古镇、人民公园、田字坊等等。当天挺热的。 有好几次去复旦吃中午饭，光华楼真高。 要开始学习了，老大昨天告诉我，下周要向两个老员工学习存储方面的知识了。这两个老员工，其中有一个是东南大学计算机系汪芸老师的学生，比我高四级。 这一次入职的新员工中，大多来自上交、复旦、北大、南大、浙大、中科院、北邮、北航、人大、同济、东南、中山、华科、武大、中科大、西交、川大、电子科大、重邮、上大，基本上都来自国内最NB的几十所学校，我感觉压力很大。 公司新开了个成都研发中心，这样，公司在中国大陆一共有三个研发中心了，另两个在上海和北京。另外，公司还有印度、爱尔兰、以色列特拉维夫等等数个研发中心。 了解了一些存储方面的基础知识以及公司的产品。公司的产品有Symmetrics、Centera、Celerra、CLARiiON，Celerra和CLARiiON已经成为历史了，现在将这两者合称为VNX。存储方面的基础知识包括SAN、NAS、RAID。还了解到VMware、RSA等等也算我们公司的，我们公司持有VMware 80%的股份。]]></description>
			<content:encoded><![CDATA[<p>十八号入职到现在，已经两周了。</p>
<p>这两周来，一直在接受培训。讲讲公司的制度等等。上周五，逛了逛上海，去了好几个地方，东方明珠、七宝古镇、人民公园、田字坊等等。当天挺热的。</p>
<p>有好几次去复旦吃中午饭，光华楼真高。</p>
<p>要开始学习了，老大昨天告诉我，下周要向两个老员工学习存储方面的知识了。这两个老员工，其中有一个是东南大学计算机系汪芸老师的学生，比我高四级。</p>
<p>这一次入职的新员工中，大多来自上交、复旦、北大、南大、浙大、中科院、北邮、北航、人大、同济、东南、中山、华科、武大、中科大、西交、川大、电子科大、重邮、上大，基本上都来自国内最NB的几十所学校，我感觉压力很大。</p>
<p>公司新开了个成都研发中心，这样，公司在中国大陆一共有三个研发中心了，另两个在上海和北京。另外，公司还有印度、爱尔兰、以色列特拉维夫等等数个研发中心。</p>
<p>了解了一些存储方面的基础知识以及公司的产品。公司的产品有Symmetrics、Centera、Celerra、CLARiiON，Celerra和CLARiiON已经成为历史了，现在将这两者合称为VNX。存储方面的基础知识包括SAN、NAS、RAID。还了解到VMware、RSA等等也算我们公司的，我们公司持有VMware 80%的股份。</p>
]]></content:encoded>
			<wfw:commentRss>http://wildpointer.net/2011/07/30/on-board-two-weeks/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>公司五周年庆</title>
		<link>http://wildpointer.net/2011/07/29/5year/</link>
		<comments>http://wildpointer.net/2011/07/29/5year/#comments</comments>
		<pubDate>Fri, 29 Jul 2011 12:47:14 +0000</pubDate>
		<dc:creator>wildpointer</dc:creator>
				<category><![CDATA[活着]]></category>

		<guid isPermaLink="false">http://wildpointer.net/?p=1083</guid>
		<description><![CDATA[今天公司进行了成立五周年庆典，好几个BOSS上台发表讲话，还给员工颁奖，最后吃蛋糕。 乐队唱歌挺好听的，唱了好几首，加州旅馆、春天里等等。 至今天，为期两周的入职培训也结束了，大BOSS还给每位新员工颁发了毕业证，呵呵。证上有我们的相片，另外还送了每位新员工两本书，其中一本是《高效能人士的七个习惯》。]]></description>
			<content:encoded><![CDATA[<p>今天公司进行了成立五周年庆典，好几个BOSS上台发表讲话，还给员工颁奖，最后吃蛋糕。</p>
<p>乐队唱歌挺好听的，唱了好几首，加州旅馆、春天里等等。</p>
<p>至今天，为期两周的入职培训也结束了，大BOSS还给每位新员工颁发了毕业证，呵呵。证上有我们的相片，另外还送了每位新员工两本书，其中一本是《高效能人士的七个习惯》。</p>
]]></content:encoded>
			<wfw:commentRss>http://wildpointer.net/2011/07/29/5year/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>大BOSS训话</title>
		<link>http://wildpointer.net/2011/07/26/big-boss/</link>
		<comments>http://wildpointer.net/2011/07/26/big-boss/#comments</comments>
		<pubDate>Tue, 26 Jul 2011 13:19:51 +0000</pubDate>
		<dc:creator>wildpointer</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://wildpointer.net/?p=1079</guid>
		<description><![CDATA[呵呵，其实也不是训话，就是提醒一下刚入职的同学们：入职后的六个月至关重要！要踏踏实实！]]></description>
			<content:encoded><![CDATA[<p>呵呵，其实也不是训话，就是提醒一下刚入职的同学们：入职后的六个月至关重要！要踏踏实实！</p>
]]></content:encoded>
			<wfw:commentRss>http://wildpointer.net/2011/07/26/big-boss/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

