﻿<?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++博客-单链DNA-随笔分类-C++</title><link>http://www.cppblog.com/Geek/category/14917.html</link><description> /*c/c++ 算法 网络 游戏编程*/ 
</description><language>zh-cn</language><lastBuildDate>Thu, 25 Nov 2010 18:45:17 GMT</lastBuildDate><pubDate>Thu, 25 Nov 2010 18:45:17 GMT</pubDate><ttl>60</ttl><item><title>new和delete与malloc和free的异同</title><link>http://www.cppblog.com/Geek/archive/2010/11/24/134445.html</link><dc:creator>Geek.tan</dc:creator><author>Geek.tan</author><pubDate>Tue, 23 Nov 2010 16:47:00 GMT</pubDate><guid>http://www.cppblog.com/Geek/archive/2010/11/24/134445.html</guid><wfw:comment>http://www.cppblog.com/Geek/comments/134445.html</wfw:comment><comments>http://www.cppblog.com/Geek/archive/2010/11/24/134445.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Geek/comments/commentRss/134445.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Geek/services/trackbacks/134445.html</trackback:ping><description><![CDATA[<div class="post-17 post type-post status-publish format-default hentry category-c tag-c" id="post-17">
<h2><a  href="http://go2-ca4.appspot.com/_?L2M4JTA5JTVlJTI4JWNiJTVlJTQ4JWE5JTdlJWVlcmZjOCUyOSU1ZSVjb2xsYW1lOCU4YiU0ZSVldGVsZWRjOCUyOSU1ZSV3ZW4vNzAvMTEvMDEwMi9tb2Muc3NlcnBkcm93LnBwY2V2b2xpLy86cHR0aA==" rel="bookmark" title="Read new和delete与malloc和free的异同">new和delete与malloc和free的异同</a></h2>
<small class="date">
<span class="date_day">7</span>
<span class="date_month">11</span>
<span class="date_year">2010</span>
</small>
<div class="entry">
<p>相同点：它们都可以用来申请动态内存和是否内存。<br>
不同点：1.malloc和free是C/C++语言的标准库函数，new和delete是C++中的运算符。<br>
2.对于非内部对象类型而言，malloc和free无法满足要求，对象在创建的同时需要自动执行构造函数，在销毁之前需要自动执行析构函数。由于
malloc和free是库函数而不是运算符，不在编译器控制权限之内，不能够把执行构造函数和析构函数强加给malloc和free。<br>
3.函数malloc原型：<br>
<code>void* malloc（size_t size）；</code>用malloc 申请一块长度为length 的整数类型的内存，程序如下：<code>int *p = (int *) malloc(sizeof(int) * length);</code>我们应当把注意力集中在两个要素上：&#8220;类型转换&#8221;和&#8220;sizeof&#8221;。<br>
1. malloc 返回值的类型是void *，所以在调用malloc 时要显式地进行类型转换，将void * 转换成所需要的指针类型。<br>
2.malloc 函数本身并不识别要申请的内存是什么类型，它只关心内存的总字节数。<br>
函数free 的原型如下：<code>void free( void * memblock );</code>为什么free
函数不象malloc 函数那样复杂呢？这是因为指针p 的类型以及它所指的内存的容量事先都是知道的，语句free(p)能正确地释放内存。如果p
是NULL 指针，那么free对p 无论操作多少次都不会出问题。如果p 不是NULL 指针，那么free 对p连续操作两次就会导致程序运行错误。<br>
4.new/delete 的使用要点<br>
运算符new 使用起来要比函数malloc 简单得多，例如：<br>
<code>int *p1 = (int *)malloc(sizeof(int) * length);<br>
int *p2 = new int[length];</code><br>
这是因为new 内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言，new 在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数，那么new 的语句也可以有多种形式。</p>
</div>
</div><img src ="http://www.cppblog.com/Geek/aggbug/134445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Geek/" target="_blank">Geek.tan</a> 2010-11-24 00:47 <a href="http://www.cppblog.com/Geek/archive/2010/11/24/134445.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++复习（二）： #ifndef。。#define。。#endif的用法</title><link>http://www.cppblog.com/Geek/archive/2010/09/13/126489.html</link><dc:creator>Geek.tan</dc:creator><author>Geek.tan</author><pubDate>Sun, 12 Sep 2010 17:20:00 GMT</pubDate><guid>http://www.cppblog.com/Geek/archive/2010/09/13/126489.html</guid><wfw:comment>http://www.cppblog.com/Geek/comments/126489.html</wfw:comment><comments>http://www.cppblog.com/Geek/archive/2010/09/13/126489.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Geek/comments/commentRss/126489.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Geek/services/trackbacks/126489.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt;"><br style="font-family: 宋体;"><span style="font-family: 宋体;">作用：</span><br style="font-family: 宋体;"><span style="font-family: 宋体;">&nbsp;&nbsp; 如果你有两个或多个C文件，这两个或多个C文件都include了同一个头文件。而编译时，这两个或多个C文件要一同编译成一个可运行文件，于是问题来了，大量的声明冲突。</span><br style="font-family: 宋体;"><span style="font-family: 宋体;">&nbsp;&nbsp; 把头文件的内容都放在#ifndef和#endif之中就可以避免重复包含多个头文件。</span><br style="font-family: 宋体;"><br style="font-family: 宋体;"><span style="font-family: 宋体;">基本用法：</span><br style="font-family: 宋体;"><span style="font-family: 宋体;">&nbsp; 　#ifndef&nbsp; 标识</span><br style="font-family: 宋体;"><span style="font-family: 宋体;">&nbsp;　 #define&nbsp; 标识</span><br style="font-family: 宋体;"><span style="font-family: 宋体;">&nbsp;　　......
</span><br style="font-family: 宋体;"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp; ......</span><br style="font-family: 宋体;"><span style="font-family: 宋体;">&nbsp;　 #endif</span><br style="font-family: 宋体;"><span style="font-family: 宋体;">&nbsp;&nbsp; &#8220;标识&#8221;理论上可以自由命名，但每个头文件中的&#8220;标识&#8221;必需唯一，习惯上</span><font style="font-family: 宋体;" size="4">头文件名全大写，前后加下划线，并把文件名中的&#8220;.&#8221;也变成下划线，如：stdio.h
</font>
<address style="font-family: 宋体;"><font size="4">&nbsp;&nbsp;&nbsp; #ifndef _STDIO_H_ <br><span style="display: none;">y6NW5GesGuest</span>&nbsp;&nbsp;&nbsp; #define _STDIO_H_ </font></address>
<address style="font-family: 宋体;"><font size="4">&nbsp;&nbsp;&nbsp; ...... </font></address>
<span>
<address style="font-family: 宋体;"><font size="4">&nbsp;&nbsp;&nbsp; #endif<br><br>参考阅读：<br>&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://tieba.baidu.com/f?kz=530162287">http://tieba.baidu.com/f?kz=530162287</a><br><br></font><span style="font-size: 12pt;"><span style="font-family: 宋体;">扩展：<br></span></span><span style="color: #ff0000;">#pragma once方式<br></span>&nbsp; #pragma
once则由编译器提供保证：同一个文件不会被包含多次。注意这里所说的&#8220;同一个文件&#8221;是指物理上的一个文件，而不是指内容相同的两个文件。带来的好处
是，你不必再费劲想个宏名了，当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝，本方法不能保证他们不被重复包含。当
然，相比宏名碰撞引发的&#8220;找不到声明&#8221;的问题，重复包含更容易被发现并修正。<br><br></address>
</span>
<br style="font-family: 宋体;"><br style="font-family: 宋体;">  </span> <img src ="http://www.cppblog.com/Geek/aggbug/126489.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Geek/" target="_blank">Geek.tan</a> 2010-09-13 01:20 <a href="http://www.cppblog.com/Geek/archive/2010/09/13/126489.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++复习（一）</title><link>http://www.cppblog.com/Geek/archive/2010/06/09/117504.html</link><dc:creator>Geek.tan</dc:creator><author>Geek.tan</author><pubDate>Wed, 09 Jun 2010 14:25:00 GMT</pubDate><guid>http://www.cppblog.com/Geek/archive/2010/06/09/117504.html</guid><wfw:comment>http://www.cppblog.com/Geek/comments/117504.html</wfw:comment><comments>http://www.cppblog.com/Geek/archive/2010/06/09/117504.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Geek/comments/commentRss/117504.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Geek/services/trackbacks/117504.html</trackback:ping><description><![CDATA[<p>1。C++提供了用关键字enum，struct，union和class建立用户自定义数据类型。和c一样，c++中的枚举也用关键字enum声明，但是，与c不同的是，c++声明的枚举是一种新的数据类型。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ex&#183;&nbsp; <br>&nbsp;&nbsp; <img style="display: none;" id="Code_Closed_Image_326801" onclick="this.style.display='none'; document.getelementbyid('code_closed_text_326801').style.display=" none="" ;="" code_open_image_326801="" document.getelementbyid(="" code_open_text_326801="" ).style.display="'inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11"><img style="display: inline;" id="Code_Open_Image_326801" onclick="this.style.display='none'; document.getelementbyid('code_open_text_326801').style.display=" none="" ;="" code_closed_image_326801="" getelementbyid(="" code_closed_text_326801="" ).style.display="'inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="display: inline;" id="Code_Open_Text_326801"><span style="color: #0000ff;">enum</span> Boolean {FALSE,TRUE};<br><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct</span> Name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">char</span> first [10];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">char</span> last[10];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union Number<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">int</span> i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff">float </font> j;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</span></p>
<p><span style="display: inline;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 建立三种用户自定义数据类型，这三种自定义类型的标记名分别为Boolean，Name和Number。可以用这些标记名声明变量。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ex.<img id="Code_Closed_Image_69815" onclick="this.style.display='none'; document.getelementbyid('code_closed_text_69815').style.display=" none="" ;="" code_open_image_69815="" document.getelementbyid(="" code_open_text_69815="" ).style.display="'inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11"><img style="display: none;" id="Code_Open_Image_69815" onclick="this.style.display='none'; document.getelementbyid('code_open_text_69815').style.display=" none="" ;="" code_closed_image_69815="" getelementbyid(="" code_closed_text_69815="" ).style.display="'inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="display: none;" id="Code_Open_Text_69815">Boolean done=FALSE；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Name&nbsp;&nbsp; student；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number x；</span></span></p>
<p>2。如果C函数原型的圆括号中什么也没有，编译器就不检查参数且不对参数个数和类型做任何假定，在调用该函数是，给函数传递任何参数编译器都不会报错。</p>
<p>3。函数参数列表中用const限定符说明不能再函数中修改传递给函数的参数。const限定符还有一些其他用法。例如声明常量指针：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">int</span> *<span style="color: #0000ff;">const</span> iPTR=&amp;intger;<br>这条语句把iPtr声明为指向一个整数的常量指针。iPtr所指向的值可以修改，但是不能把iPtr指向其他内存单元。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> *iPtr=&amp;intger；<br>这条语句把iPtr声明为指向整数常量的指针。iPtr所引用的值不能修改，但是可以吧iPtr指向其他内存单元。</p>
<p>4。默认参数必须是函数参数列表中的最右边的参数。</p>
<p>5。单目运算符（：：）能够使程序访问与作用域内局部变量同名的全部变量。</p>
<p>6。C++和C对函数名的处理方式不同，所以试图把C代码和C++代码连接时，在C中编译的函数不能被<br>C++识别。要通知编译器一个或多个已经在C中编译，像下面写出其函数原型：<br><span style="color: #0000ff;">extern</span> &#8220;C&#8221; 函数原型&nbsp;&nbsp; <span style="color: #008000;">//单个函数</span><br><br><span style="color: #0000ff;">extern</span> &#8220;C&#8221;<span style="color: #008000;">//多个函数</span><br>{<br>&nbsp;&nbsp; 函数原型<br>}<br>这些声明通知编译器指定的函数不在C++中编译，因此不对连接说明中列出的函数名编码。这些函数能够得到正确的连接。<br></p>
<p><br>&nbsp;</p><img src ="http://www.cppblog.com/Geek/aggbug/117504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Geek/" target="_blank">Geek.tan</a> 2010-06-09 22:25 <a href="http://www.cppblog.com/Geek/archive/2010/06/09/117504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>