- 浏览: 175834 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (140)
- java (138)
- 佳能500d (1)
- 佳能 (1)
- Oracle数据库文档构造器--Oraschemadoc (1)
- EJB调用的原理分析 (1)
- 使用css3画"静音"icon (1)
- 张小庆,在路上(16)-给弟弟找工作 (1)
- Android短信编解码方式 (1)
- lua web 开发 (1)
- zk安装 (1)
- 菜单多国语言化遇到的问题 (1)
- 【转】纯文本配置还是注册表 (1)
- C++ delete删除动态分配的内存 (1)
- eclipse下修改项目名导致tomcat内发布名不一致的解决方法 (1)
- Lucene实现各种常见文档的全文检索 (1)
- 项目风险之人员流动风险 (1)
- 时空数据模型简介 (1)
- XSLT学习笔记 (1)
- 依然是计划 如果没有计划似乎就没有了动力 (1)
- How to Succeed in A Professional Career (1)
- 编程环境应该和讨论社区完美的进行结合 (1)
- C#坦克大战实现 (1)
- 电脑用户密码忘记了怎么办? (1)
- java.lang.NoClassDefFoundError: org/dom4j/DocumentException (1)
- 关于成立北京Android爱好者俱乐部的声明 (1)
- Android开发之初探音频的播放 (1)
- Struts标签循环List (1)
- CAP原理 (1)
- javabean的自动生成 (1)
- 打开CMD一闪就关的解决方案 (1)
- 我是项目经理,我的项目管理日记【20111202】 (1)
- Html5游戏开发入门笔记--<躲砖块> (1)
- mysql中查看和设置系统字符编码 (1)
- PhoneGap-Accelerometer (1)
- [Jetty]Jetty工作原理 (1)
- Ibatis+Spring整合实例Demo+源码 (1)
最新评论
-
u012985907:
dsdsdsdsd
FLASH上传与拍照 -头像-avatart -
a379933101:
?????????????????????????????
android listview 连续调用 getview问题分析及解决 -
151tmac:
拜托下次粘贴的时候,粘贴为纯文本
android listview 连续调用 getview问题分析及解决 -
liudezhong135:
...
Spring3MVC 在JSP中使用@ModelAttribute -
香飘飘2011:
要是不知道层次级别,如何退回到根目录呢
FTP退回到根目录
<h4 class="docSection2Title">耗尽内存</h4>
表达式就有可能失败。如果 <tt>new</tt> 表达式无法获取需要的内存空间,系统将抛出名为 <tt>bad_alloc</tt> 的异常。我们将在<a class="docLink">第 6.13
节</a>介绍如何抛出异常。
<a name="ch05lev2sec20"></a>
<h4 class="docSection2Title">撤销动态创建的对象</h4>
<a name="idd1e38354"></a><a name="idd1e38357"></a><a name="idd1e38361"></a><a name="idd1e38367"></a><a name="idd1e38374"></a><a name="idd1e38379"></a><a name="idd1e38385"></a>
<p class="docText">动态创建的对象用完后,程序员必须<span class="docEmphasis">显式</span>地将该对象占用的内存返回给自由存储区。C++ 提供了 <tt>delete</tt>
表达式释放指针所指向的地址空间。
delete pi;
</pre>
<p class="docText">frees the memory associated with the <tt>int</tt> object
addressed by <tt>pi</tt>.
<p class="docText">
<a name="ch05note14"></a>
<div class="docNote">
<table border="0" cellspacing="0" cellpadding="1" width="90%"><tbody><tr>
<td width="60" valign="top"><br></td>
<td valign="top">
是不合法的。
</td>
</tr></tbody></table>
<a name="ch05term9"></a>
<p class="docText">C++ 没有明确定义如何释放指向不是用 <tt>new</tt> 分配的内存地址的指针。下面提供了一些安全的和不安全的
<span class="docEmphRoman"><a class="docLink">delete expressions</a></span> 表达式。
int i;
int *pi = &i;
string str = "dwarves";
double *pd = new double(33);
delete str; // <span class="docEmphItalicAlt">error:</span> <span class="docEmphasis">str</span> <span class="docEmphItalicAlt">is not a dynamic object</span>
delete pi; // <span class="docEmphItalicAlt">error:</span> <span class="docEmphasis">pi</span> <span class="docEmphItalicAlt">refers to a local</span>
delete pd; // <span class="docEmphItalicAlt">ok</span>
</pre>
<p class="docText">
语句。编译器知道
<tt>str</tt>
并不是一个指针,因此会在编译时就能检查出这个错误。第二个错误则比较隐蔽:通常来说,编译器不能断定一个指针指向什么类型的对象,因此尽管这个语句是错误的,但在大部分编译器上仍能通过。
<a name="ch05lev2sec21"></a>
<h4 class="docSection2Title"><span style="font-family: monospace;"><br></span></h4>
<h4 class="docSection2Title">零值指针的删除</h4>
<pre> int *ip = 0;
delete ip; // <span class="docEmphItalicAlt">ok: always ok to delete a pointer that is equal to 0</span>
</pre>
<p class="docText">
<h4 class="docSection2Title">在 <tt>delete</tt> 之后,重设指针的值</h4>
<p class="docText">
<pre> delete p;
</pre>
<p class="docText"><span style="font-family: monospace;"><br></span>
没有定义,但仍然存放了它之前所指向对象的地址,然而 <tt>p</tt> 所指向的内存已经被释放,因此 <tt>p</tt> 不再有效。
<a name="ch05note15"></a>
<div class="docNote">
<table border="0" cellspacing="0" cellpadding="1" width="90%"><tbody><tr>
<td width="60" valign="top"><br></td>
<td valign="top">
<p class="docText">一旦删除了指针所指向的对象,立即将指针置为
0,这样就非常清楚地表明指针不再指向任何对象。
</td>
</tr></tbody></table>
<br>
<h4 class="docSection2Title">
<tt>const</tt> 对象的动态分配和回收</h4>
<p class="docText">C++ 允许动态创建 <tt>const</tt> 对象:
const int *pci = new const int(1024);
</pre>
<a name="ch05term14"></a>
<p class="docText">
对象必须在创建时初始化,并且一经初始化,其值就不能再修改。上述
<span class="docEmphRoman"><a class="docLink">new 表达式</a></span>返回指向 <tt>int</tt> 型
<tt>const</tt> 对象的指针。与其他 <tt>const</tt> 对象的地址一样,由于 <tt>new</tt> 返回的地址上存放的是
<tt>const</tt> 对象,因此该地址只能赋给指向 <tt>const</tt> 的指针。
<pre> // <span class="docEmphItalicAlt">allocate default initialized</span> <span class="docEmphasis">const</span> <span class="docEmphItalicAlt">empty string</span>
const string *pcs = new const string;
</pre>
<p class="docText">
所指向的对象初始化为空的 <tt>string</tt> 对象。内置类型对象或未提供默认构造函数的类类型对象必须显式初始化。
<a name="ch05sb17"></a>
<table border="1" cellspacing="0" cellpadding="5" width="90%"><tbody><tr>
<td>
<h2 class="docSidebarTitle">警告:动态内存的管理容易出错</h2>
<p class="docText"><span class="docEmphStrong">下面三种常见的程序错误都与动态内存分配相关:</span>
<div style="font-weight: bold;">
<ol class="docList" type="1">
<li>
<div style="font-weight: normal;">
)指向动态分配内存的指针失败,因而无法将该块内存返还给自由存储区。删除动态分配内存失败称为“内存泄漏(memory
leak)”。内存泄漏很难发现,一般需等应用程序运行了一段时间后,耗尽了所有内存空间时,内存泄漏才会显露出来。
</li>
<li>
<div style="font-weight: normal;">
读写已删除的对象。如果删除指针所指向的对象之后,将指针置为 0
值,则比较容易检测出这类错误。
</li>
<li>
<div style="font-weight: normal;">
表达式。当两个指针指向同一个动态创建的对象,删除时就会发生错误。如果在其中一个指针上做 <tt>delete</tt>
运算,将该对象的内存空间返还给自由存储区,然后接着 <tt>delete</tt>
第二个指针,此时则自由存储区可能会被破坏。
</li>
</ol>
</td>
</tr></tbody></table>
<br><a name="ch05lev2sec24"></a>
<h4 class="docSection2Title">删除 <tt>const</tt> 对象</h4>
<a name="idd1e38708"></a><a name="idd1e38711"></a>
<p class="docText">
对象的值,但可撤销对象本身。如同其他动态对象一样,
<tt>const</tt> 动态对象也是使用删除指针来释放的:
</pre>
<p class="docText">
对象的指针,该语句同样有效地回收 <tt>pci</tt> 所指向的内容。
发表评论
-
Ibatis+Spring整合实例Demo+源码
2012-02-08 12:58 1403<span style="color: ... -
[Jetty]Jetty工作原理
2012-02-07 17:29 993http://www.ibm.com/develo ... -
PhoneGap-Accelerometer
2012-02-07 14:23 1207采集设备在x、y、z方向上的动作。 acce ... -
mysql中查看和设置系统字符编码
2012-02-04 14:28 1707--查看数据库的字符集 show variables ... -
Html5游戏开发入门笔记--<躲砖块>
2012-02-03 12:04 1168学习了html5中的canvas画布元素,自己写了一个 ... -
我是项目经理,我的项目管理日记【20111202】
2012-02-03 10:19 994其实前段时间项目 ... -
打开CMD一闪就关的解决方案
2012-02-02 12:14 1386转:http://blog.163.com/cumt_ ... -
javabean的自动生成
2012-02-02 11:59 1399在jcreator pro中自动生成 在j ... -
CAP原理
2012-02-01 09:00 1152作者:NinGoo 原文链接:ht ... -
Struts标签循环List
2012-01-31 14:18 966<pre name="code&quo ... -
Android开发之初探音频的播放
2012-01-11 16:29 1087<h1>Android开发之初探音频的播放 ... -
关于成立北京Android爱好者俱乐部的声明
2012-01-11 14:33 860<blockquote dir="lt ... -
java.lang.NoClassDefFoundError: org/dom4j/DocumentException
2011-12-28 13:03 15096<span style="font-f ... -
电脑用户密码忘记了怎么办?
2011-12-28 12:14 981<span style="fon ... -
C#坦克大战实现
2011-12-20 13:29 1121记得在大学学java ... -
编程环境应该和讨论社区完美的进行结合
2011-12-19 11:54 761在学习.NET过程中,经常会遇到很多问题,有的时候会找 ... -
How to Succeed in A Professional Career
2011-12-19 10:29 731(From Microsoft)<br>& ... -
依然是计划 如果没有计划似乎就没有了动力
2011-12-15 10:39 879</span></span>& ... -
XSLT学习笔记
2011-12-14 14:04 668<p class="MsoNorma ... -
时空数据模型简介
2011-12-14 13:59 1483<p class="MsoNo ...
相关推荐
C++动态分配内存(new)和撤销内存(delete) 在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了较简便而...
堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。 很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。 在 C++ 中,您可以使用特殊的运算符...
C++的动态存储分配: new 类型名T(初值列表) 功能:申请用于存放T类型对象的内存空间,并依初值列表赋以初值 结果值: 成功:T类型的指针,指向新分配的内存 失败:0(NULL) delete 指针P ...
C/C++问题总结 1. 关键字 1.1 const 1.1.1 常量 1.1.2 修饰指针 1.1.3 修饰函数参数与返回值 1.1.4 类中的应用 1.2 static 1.3 volatile 1.4 extern ...3.20.1 程序内存分配 3.20.2 堆和栈 3.20.3 栈溢出
CLR编程CLR的动态内存分配以不同的方式工作,CLR维护其独立于本地C++堆的内存堆。当我们不再需要在CLR堆上分配...前缀gc表明,我们是在可回收垃圾的堆上分配内存,而不是在一切整理工作都要编程人员负责的本地C++堆上。
C++中new和delete是对内存分配的运算符,取代了C中的malloc和free。 标准C++中的字符串类取代了C标准C函数库头文件中的字符数组处理函数。 C++中用来做控制态输入输出的iostream类库替代了标准C中的stdio函数库。...
c++智能指针介绍 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要... RAII 的主要原则是为所有堆分配资源提供所有权,例如动态分配内存或系统对象句柄、析构函数包含要删除或释放资源的代码的堆栈分
智能指针 智能指针 在 C++ 中,我们申请内存⼀般使⽤ new,释放内存时使⽤ delete,但是有时候我们可能由于疏忽会忘记 delete,或者当程序有多个 出⼝时,也会容易有 new 没有 delete,这样就产⽣了内存泄漏,如果...
注意 手工分配内存的清除 和CDC对象的删除 以释放系统的GDI资源 每一个new操作符都要对应一个delete 虽然已经弄出来了,还是希望大家好好读读源程序。 你们以后的工作: 在菜单中添加菜单项,通过ClassWizzard ...
C++智能指针的原理和实现 智能指针的原理和实现 ⼀、智能指针起因 ⼀、智能指针起因 在C++中,动态内存的管理是由程序员⾃⼰申请和释放的,⽤⼀对运算符完成:new和delete。 new:在动态内存中为对象分配⼀块空间并...
delete删除运算符 释放内存块。 语法 [::] delete cast-expression [::] delete [ ] cast-expression 备注 cast-expression 参数必须是指向以前分配给使用 new 运算符创建的对象的内存块的指针。 delete 运算符的...
12.1 动态内存与智能指针 400 12.1.1 shared_ptr类 400 12.1.2 直接管理内存 407 12.1.3 shared_ptr和new结合使用 412 12.1.4 智能指针和异常 415 12.1.5 unique_ptr 417 12.1.6 weak_ptr 420 12.2 ...
【原书名】 C++ Primer (4th Edition) 【原出版社】 Addison Wesley/Pearson 【作者】 (美)Stanley B.Lippman,Josée LaJoie,Barbara E.Moo 【译者】 李师贤 蒋爱军 梅晓勇 林...18.1.1 C++中的内存分配 632 18.1.2 ...
4.3.3 为数组动态分配内存 4.3.4 多维数组的动态分配 4.4 使用引用 4.4.1 引用的概念 4.4.2 声明并初始化引用 4.5 C++/CLI编程 4.5.1 跟踪句柄 4.5.2 CLR数组 4.5.3 字符串 4.5.4 跟踪引用 4.5.5 内部指针 4.6 小结 ...
4.3.3 为数组动态分配内存 4.3.4 多维数组的动态分配 4.4 使用引用 4.4.1 引用的概念 4.4.2 声明并初始化引用 4.5 C++/CLI编程 4.5.1 跟踪句柄 4.5.2 CLR数组 4.5.3 字符串 4.5.4 跟踪引用 4.5.5 内部指针 4.6 小结 ...
4.3.3 为数组动态分配内存 4.3.4 多维数组的动态分配 4.4 使用引用 4.4.1 引用的概念 4.4.2 声明并初始化引用 4.5 C++/CLI编程 4.5.1 跟踪句柄 4.5.2 CLR数组 4.5.3 字符串 4.5.4 跟踪引用 4.5.5 内部指针 4.6 小结 ...
3. 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。 16.是不是一个...
12.1 动态内存与智能指针 400 12.1.1 shared_ptr类 400 12.1.2 直接管理内存 407 12.1.3 shared_ptr和new结合使用 412 12.1.4 智能指针和异常 415 12.1.5 unique_ptr 417 12.1.6 weak_ptr 420 12.2 ...
在使用Debug版的malloc分配内存时,malloc会在内存块的头中记录分配该内存的文件名及行号。当程序退出时CRT会在main()函数返回之后做一些清理工作,这个时候来检查调试堆内存,如果仍然有内存没有被释放,则一定是...
4.3.3 为数组动态分配内存 169 4.3.4 多维数组的动态分配 171 4.4 使用引用 172 4.4.1 引用的概念 172 4.4.2 声明并初始化lvalue引用 172 4.4.3 声明并初始化rvalue引用 173 4.5 字符串的本地c++库函数 174 ...