`
lucene321
  • 浏览: 175839 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++ delete删除动态分配的内存

阅读更多

   


<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 = &amp;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> 所指向的内容。

 
0
0
分享到:
评论

相关推荐

    C++动态分配和撤销内存以及结构体类型作为函数参数

    C++动态分配内存(new)和撤销内存(delete) 在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了较简便而...

    一文搞懂C++ 动态内存

    堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。 很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。 在 C++ 中,您可以使用特殊的运算符...

    C/C++ 动态存储分配

     C++的动态存储分配:  new 类型名T(初值列表)  功能:申请用于存放T类型对象的内存空间,并依初值列表赋以初值  结果值:  成功:T类型的指针,指向新分配的内存  失败:0(NULL)  delete 指针P ...

    C_C++问题总结

    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 内幕

    CLR编程CLR的动态内存分配以不同的方式工作,CLR维护其独立于本地C++堆的内存堆。当我们不再需要在CLR堆上分配...前缀gc表明,我们是在可回收垃圾的堆上分配内存,而不是在一切整理工作都要编程人员负责的本地C++堆上。

    新手学习C++入门资料

    C++中new和delete是对内存分配的运算符,取代了C中的malloc和free。 标准C++中的字符串类取代了C标准C函数库头文件中的字符数组处理函数。 C++中用来做控制态输入输出的iostream类库替代了标准C中的stdio函数库。...

    关于c++ 智能指针及 循环引用的问题

    c++智能指针介绍 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要... RAII 的主要原则是为所有堆分配资源提供所有权,例如动态分配内存或系统对象句柄、析构函数包含要删除或释放资源的代码的堆栈分

    C++智能指针.pdf

    智能指针 智能指针 在 C++ 中,我们申请内存⼀般使⽤ new,释放内存时使⽤ delete,但是有时候我们可能由于疏忽会忘记 delete,或者当程序有多个 出⼝时,也会容易有 new 没有 delete,这样就产⽣了内存泄漏,如果...

    OpenCV C++完整的车牌识别系统.rar

    注意 手工分配内存的清除 和CDC对象的删除 以释放系统的GDI资源 每一个new操作符都要对应一个delete 虽然已经弄出来了,还是希望大家好好读读源程序。 你们以后的工作: 在菜单中添加菜单项,通过ClassWizzard ...

    C++智能指针的原理和实现.pdf

    C++智能指针的原理和实现 智能指针的原理和实现 ⼀、智能指针起因 ⼀、智能指针起因 在C++中,动态内存的管理是由程序员⾃⼰申请和释放的,⽤⼀对运算符完成:new和delete。 new:在动态内存中为对象分配⼀块空间并...

    C++编程中删除运算符与相等运算符的使用解析

    delete删除运算符 释放内存块。 语法 [::] delete cast-expression [::] delete [ ] cast-expression 备注 cast-expression 参数必须是指向以前分配给使用 new 运算符创建的对象的内存块的指针。 delete 运算符的...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     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第四版【中文高清扫描版】.pdf

    【原书名】 C++ Primer (4th Edition) 【原出版社】 Addison Wesley/Pearson 【作者】 (美)Stanley B.Lippman,Josée LaJoie,Barbara E.Moo 【译者】 李师贤 蒋爱军 梅晓勇 林...18.1.1 C++中的内存分配 632 18.1.2 ...

    Visual C++ 2005入门经典.part08.rar (整理并添加所有书签)

    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 小结 ...

    Visual C++ 2005入门经典.part04.rar (整理并添加所有书签)

    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 小结 ...

    Visual C++ 2005入门经典.part05.rar (整理并添加所有书签)

    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 小结 ...

    最新名企标准通用C++面试题,

    3. 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。 16.是不是一个...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     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 ...

    vld(Visual Leak Detector 内存泄露检测工具 源码)

    在使用Debug版的malloc分配内存时,malloc会在内存块的头中记录分配该内存的文件名及行号。当程序退出时CRT会在main()函数返回之后做一些清理工作,这个时候来检查调试堆内存,如果仍然有内存没有被释放,则一定是...

    visualC++2010入门经典源代码

    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 ...

Global site tag (gtag.js) - Google Analytics