📄 经典收藏之 - c++内存管理详解 - _net - csdn技术中心.htm
字号:
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 << “eat memory” <<
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 << sizeof(char) << endl;<BR>cout << sizeof(int)
<< endl;<BR>cout << sizeof(unsigned int) <<
endl;<BR>cout << sizeof(long) << endl;<BR>cout <<
sizeof(unsigned long) << endl;<BR>cout << sizeof(float)
<< endl;<BR>cout << sizeof(double) << endl;<BR>cout
<< sizeof(void *) <<
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>您认为本文应该得 <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> <SPAN
id=oImageDescription name="oImageDescription"> <IMG
src="经典收藏之 - C++内存管理详解 - _net - CSDN技术中心.files/tech_star1.gif"> <IMG
src="经典收藏之 - C++内存管理详解 - _net - CSDN技术中心.files/tech_star1.gif"> <IMG
src="经典收藏之 - C++内存管理详解 - _net - CSDN技术中心.files/tech_star1.gif"> <IMG
src="经典收藏之 - C++内存管理详解 - _net - CSDN技术中心.files/tech_star1.gif"> <IMG
src="经典收藏之 - C++内存管理详解 - _net - CSDN技术中心.files/tech_star3.gif"> 共有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)+'&u='+escape(d.location.href)+'&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>北京百联美达美数码科技有限公司 版权所有 京 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 + -