⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 经典收藏之 - c++内存管理详解 - _net - csdn技术中心.htm

📁 很好的收集,看了以后都不知道说什么了. 都是关于内存调试方面的.十分有用.
💻 HTM
📖 第 1 页 / 共 4 页
字号:
98下用Visual 
C++编写了测试程序,见示例7。这个程序会无休止地运行下去,根本不会终止。因为32位操作系统支持“虚存”,内存用完了,自动用硬盘空间顶替。我只听到硬盘嘎吱嘎吱地响,Window 
98已经累得对键盘、鼠标毫无反应。<BR><BR>  我可以得出这么一个结论:对于32位以上的应用程序,“内存耗尽”错误处理程序毫无用处。这下可把Unix和Windows程序员们乐坏了:反正错误处理程序不起作用,我就不写了,省了很多麻烦。<BR><BR>  我不想误导读者,必须强调:不加错误处理将导致程序的质量很差,千万不可因小失大。<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
  <TBODY>
  <TR>
    <TD>void main(void)<BR>{<BR> float *p = NULL;<BR> while(TRUE)<BR> {<BR>  p 
      = new float[1000000]; <BR>  cout &lt;&lt; “eat memory” &lt;&lt; 
      endl;<BR>  if(p==NULL)<BR>   exit(1);<BR> }<BR>}</TD></TR></TBODY></TABLE></P>
<P><BR>  示例7试图耗尽操作系统的内存</P>
<P>  <STRONG>8、malloc/free 的使用要点<BR><BR></STRONG>  函数malloc的原型如下:<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
  <TBODY>
  <TR>
    <TD>void * malloc(size_t 
size);</TD></TR></TBODY></TABLE><BR>  用malloc申请一块长度为length的整数类型的内存,程序如下:<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
  <TBODY>
  <TR>
    <TD>int *p = (int *) malloc(sizeof(int) * 
length);</TD></TR></TBODY></TABLE><BR>  我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。<BR><BR>  * 
malloc返回值的类型是void *,所以在调用malloc时要显式地进行类型转换,将void * 转换成所需要的指针类型。<BR><BR>  * 
malloc函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。我们通常记不住int, 
float等数据类型的变量的确切字节数。例如int变量在16位系统下是2个字节,在32位下是4个字节;而float变量在16位系统下是4个字节,在32位下也是4个字节。最好用以下程序作一次测试: 
<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
  <TBODY>
  <TR>
    <TD>cout &lt;&lt; sizeof(char) &lt;&lt; endl;<BR>cout &lt;&lt; sizeof(int) 
      &lt;&lt; endl;<BR>cout &lt;&lt; sizeof(unsigned int) &lt;&lt; 
      endl;<BR>cout &lt;&lt; sizeof(long) &lt;&lt; endl;<BR>cout &lt;&lt; 
      sizeof(unsigned long) &lt;&lt; endl;<BR>cout &lt;&lt; sizeof(float) 
      &lt;&lt; endl;<BR>cout &lt;&lt; sizeof(double) &lt;&lt; endl;<BR>cout 
      &lt;&lt; sizeof(void *) &lt;&lt; 
endl;</TD></TR></TBODY></TABLE><BR>  在malloc的“()”中使用sizeof运算符是良好的风格,但要当心有时我们会昏了头,写出 
p = malloc(sizeof(p))这样的程序来。<BR><BR>  * 函数free的原型如下:<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
  <TBODY>
  <TR>
    <TD>void free( void * memblock 
);</TD></TR></TBODY></TABLE><BR>  为什么free函数不象malloc函数那样复杂呢?这是因为指针p的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放内存。如果p是NULL指针,那么free对p无论操作多少次都不会出问题。如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。<BR><BR>  <STRONG>9、new/delete 
的使用要点</STRONG><BR><BR>  运算符new使用起来要比函数malloc简单得多,例如:<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
  <TBODY>
  <TR>
    <TD>int *p1 = (int *)malloc(sizeof(int) * length);<BR>int *p2 = new 
      int[length];</TD></TR></TBODY></TABLE><BR>  这是因为new内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言,new在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数,那么new的语句也可以有多种形式。例如<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
  <TBODY>
  <TR>
    <TD>class Obj<BR>{<BR> public :<BR>  Obj(void); // 无参数的构造函数<BR>  Obj(int 
      x); // 带一个参数的构造函数<BR>  …<BR>}<BR>void Test(void)<BR>{<BR> Obj *a = new 
      Obj;<BR> Obj *b = new Obj(1); // 初值为1<BR> …<BR> delete a;<BR> delete 
      b;<BR>}</TD></TR></TBODY></TABLE><BR>  如果用new创建对象数组,那么只能使用对象的无参数构造函数。例如<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
  <TBODY>
  <TR>
    <TD>Obj *objects = new Obj[100]; // 
创建100个动态对象</TD></TR></TBODY></TABLE><BR>  不能写成<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
  <TBODY>
  <TR>
    <TD>Obj *objects = new Obj[100](1);// 
创建100个动态对象的同时赋初值1</TD></TR></TBODY></TABLE><BR>  在用delete释放对象数组时,留意不要丢了符号‘[]’。例如<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
  <TBODY>
  <TR>
    <TD>delete []objects; // 正确的用法<BR>delete objects; // 
错误的用法</TD></TR></TBODY></TABLE><BR>  后者相当于delete 
objects[0],漏掉了另外99个对象。<BR><BR>  <STRONG>10、一些心得体会</STRONG><BR><BR>  我认识不少技术不错的C++/C程序员,很少有人能拍拍胸脯说通晓指针与内存管理(包括我自己)。我最初学习C语言时特别怕指针,导致我开发第一个应用软件(约1万行C代码)时没有使用一个指针,全用数组来顶替指针,实在蠢笨得过分。躲避指针不是办法,后来我改写了这个软件,代码量缩小到原先的一半。<BR><BR>  我的经验教训是:<BR><BR>  (1)越是怕指针,就越要使用指针。不会正确使用指针,肯定算不上是合格的程序员。<BR><BR>  (2)必须养成“使用调试器逐步跟踪程序”的习惯,只有这样才能发现问题的本质。<BR></P>
<P></P></DIV>
<DIV class=story_con_point>
<P>您认为本文应该得&nbsp;<SELECT id=oPointRange name=oPointValue><OPTION 
  value=1>1</OPTION><OPTION value=2>2</OPTION><OPTION value=3 
  selected>3</OPTION><OPTION value=4>4</OPTION><OPTION value=5>5</OPTION></SELECT><INPUT id=btnRankPost onclick="return UpdateImageDescription(1)" type=button value=打分 name=btnRankPost>&nbsp;<SPAN 
id=oImageDescription name="oImageDescription">&nbsp;<IMG 
src="经典收藏之 - C++内存管理详解 - _net - CSDN技术中心.files/tech_star1.gif">&nbsp;<IMG 
src="经典收藏之 - C++内存管理详解 - _net - CSDN技术中心.files/tech_star1.gif">&nbsp;<IMG 
src="经典收藏之 - C++内存管理详解 - _net - CSDN技术中心.files/tech_star1.gif">&nbsp;<IMG 
src="经典收藏之 - C++内存管理详解 - _net - CSDN技术中心.files/tech_star1.gif">&nbsp;<IMG 
src="经典收藏之 - C++内存管理详解 - _net - CSDN技术中心.files/tech_star3.gif">&nbsp;共有5人参与打分</SPAN><SPAN 
id=oHelperUI><A onclick="javascript:return PrintPage();" 
href="http://dev.csdn.net/author/xpzhang/5f58e10eec1a4b76bd58ff37f05d30fb.html#">打印</A>|<A 
title=功能强大的网络收藏夹,一秒钟操作就可以轻松实现保存带来的价值、分享带来的快乐 
href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'saveit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();">收藏</A>|<A 
href="http://dev.csdn.net/author/xpzhang/5f58e10eec1a4b76bd58ff37f05d30fb.html#Comment">讨论</A>|<A 
href="mailto:techcenter@csdn.net">投诉</A></SPAN><SPAN id=oArticleID 
style="DISPLAY: none">5f58e10e-ec1a-4b76-bd58-ff37f05d30fb</SPAN></P></DIV>
<DIV class=author_inter><IMG alt=暂无图片 
src="经典收藏之 - C++内存管理详解 - _net - CSDN技术中心.files/xpzhang.jpg" target="_blank">
<P>兢兢业业,而不急功近利;实事求是,而不哗众取宠。</P></DIV><!--CompositeUI_Author:CHONGCHONG2008_MSN:chongchong2008@msn.com_Address:YiChang HuBei CHINA_UI End-->
<DIV class=author_art>
<DIV class=author_art_l>
<H5>作者其他文章: <SPAN><!--ArticleMore_Author:CHONGCHONG2008_MSN:chongchong2008@msn.com_UI Start--><A 
href="http://dev.csdn.net/author/xpzhang/index.html" target=_blank>更多</A><!--ArticleMore_Author:CHONGCHONG2008_MSN:chongchong2008@msn.com_UI End--> 
</SPAN></H5>
<DIV class=author_art_l_list>
<UL><!--ArticleListUI_Author:CHONGCHONG2008_MSN:chongchong2008@msn.com_Address:YiChang HuBei CHINA_UI Start-->
  <LI><A 
  href="http://dev.csdn.net/author/xpzhang/0ab0b60fe279445a9ba84d317d16f80a.html" 
  target=_self>Keil C 编译器常见警告与错误信息的解决方法 </A><!--ArticleListUI_Author:CHONGCHONG2008_MSN:chongchong2008@msn.com_Address:YiChang HuBei CHINA_UI End--></LI></UL></DIV></DIV>
<DIV class=author_art_r>
<H5>相关文章:<SPAN></SPAN></H5>
<DIV class=author_art_r_list>
<UL></UL></DIV></DIV></DIV>
<DIV class=tech_comment>
<H5 id=Comment>评论</H5>
<DIV class=tech_comment_con>
<SCRIPT src="经典收藏之 - C++内存管理详解 - _net - CSDN技术中心.files/CAE7A76D.htm"></SCRIPT>

<DIV id=HotComment>
<UL>
  <SCRIPT 
  src="经典收藏之 - C++内存管理详解 - _net - CSDN技术中心.files/NewsCsdnNetJsRemarkTop.htm" 
  type=text/javascript></SCRIPT>
</UL></DIV></DIV></DIV>
<SCRIPT>document.write("<img src=http://counter.csdn.net/pv.aspx?id=37 border=0 width=0 height=0>");</SCRIPT>
</DIV><!-- content over  --></DIV></DIV>
<DIV class=techfooter>
<P>CSDN技术中心团队官方Blog:<A href="http://blog.csdn.net/techcenter/" 
target=_blank>http://blog.csdn.net/techcenter/</A>,反馈邮箱:<A 
href="mailto:techcenter%20at%20csdn.net" target=_blank>techcenter at 
csdn.net</A> (注意:请把 at 换成@)</P></DIV>
<STYLE>#CFBig {
	CLEAR: both; FONT-SIZE: 12px; MARGIN: auto; WIDTH: 1000px; FONT-FAMILY: Tahoma, sans-serif; TEXT-ALIGN: center
}
#CFBig #CFContent {
	MARGIN: auto; WIDTH: 500px; TEXT-ALIGN: center
}
#CFBig #CFContent P {
	MARGIN: 2px
}
#CFBig HR {
	COLOR: #4682b4; HEIGHT: 1px
}
#CFBig #CFBiaoShi {
	FLOAT: right; WIDTH: 40px
}
#CFBig A:link {
	COLOR: #000; TEXT-DECORATION: none
}
#CFBig A:visited {
	COLOR: #000; TEXT-DECORATION: none
}
#CFBig A:hover {
	COLOR: #369; TEXT-DECORATION: none
}
#CFBig A:active {
	COLOR: #000; TEXT-DECORATION: none
}
</STYLE>
<!-- 页脚 -->
<DIV style="TEXT-ALIGN: center">
<DIV id=CFBig>
<HR>

<DIV id=CFContent>
<DIV id=CFBiaoShi><A 
href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG 
height=48 alt="" src="经典收藏之 - C++内存管理详解 - _net - CSDN技术中心.files/BiaoShi.gif" 
width=40 border=0></A> </DIV>
<P><A href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A>-<A 
href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A>-<A 
href="http://www.csdn.net/map/map.shtm">网站地图</A>-<A 
href="http://www.csdn.net/help/help.asp">帮助</A>-<A 
href="http://www.csdn.net/intro/intro.asp?id=9">联系方式</A>-<A 
href="http://job.csdn.net/Jobs/f9c75c9f2ad14404a604669b757b9ed0/viewcompany.aspx">诚聘英才</A>-<A 
href="http://www.csdn.net/english/">English</A>-<A 
href="javascript:navigate('mai'%20+%20'lto:'%20+%20'webm'%20+%20'aster@c'%20+%20'sdn.n'+'et?subject=向CSDN报告问题')">问题报告</A></P>
<P>北京百联美达美数码科技有限公司&nbsp;&nbsp;版权所有&nbsp;&nbsp;京 ICP 证 020026 号</P>
<P>Copyright © 2000-2006, CSDN.NET, All Rights Reserved</P></DIV>
<HR>
</DIV></DIV>
<SCRIPT src="经典收藏之 - C++内存管理详解 - _net - CSDN技术中心.files/counter.js"></SCRIPT>
<!-- /页脚 --></FORM></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -