当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

<b>关于指针和内存的几个问题</b>[VC/C++编程]

赞助商链接



  本文“<b>关于指针和内存的几个问题</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

1、"delete p" 会删去 "p" 指针,还是它指到的资料,"*p" ?

该指针指到的资料."delete" 真正的意思是:「删去指针指到的东西」(delete the thing pointed to by).一样的英文误用也发生在 C 语言的「释放」指标所指向的记忆体("free(p)"真正的意思是:"free_the_stuff_pointed_to_by(p)" ).

2、能 "free()" 掉由 "new" 配置到的、"delete" 掉由 "malloc()" 配置到的记忆体吗?

不行.在同一个程式里,利用 malloc/free 及 new/delete 是完好合理、公道、安全的;但 free 掉由 new 配置到的,或 delete 掉由 malloc 配置到的指标则是不合理、不公道的.

3、为什麽该用 "new" 而不是 malloc() ?

建构子/解构子、型别安全性、可被覆盖(overridability).建构子/解构子:和 "malloc(sizeof(Fred))" 差别,"new Fred()" 还会去呼唤Fred 的建构子.同理,"delete p" 会去呼唤 "*p" 的解构子.

型别安全性:malloc() 会传回一个不具型别安全的 "void*",而 "new Fred()" 则会传回精确型态的指标(一个 "Fred*").

可被覆盖:"new" 是个可被物件类别覆盖的运算子,而 "malloc" 不是以「各个类别」作为覆盖的基准.

4、为什麽 C++ 不替 "new" 及 "delete" 搭配个 "realloc()" ?

避免你产生不测.当 realloc() 要拷贝配置区时,它做的是「逐位元 bitwise」的拷贝,这会弄坏大

部份的 C++ 物件.不过 C++ 的物件应当可以自我拷贝才对:用它们自己的拷贝建构子或设定运算子.

5、该怎样配置/释放阵列?

用 new[] 和 delete[] :

Fred* p = new Fred[100];

//...

delete [] p;

每当你在 "new" 运算式顶用了 "[...]" 的话,你就 *!*必须*!* 在 "delete" 报告中利用 "[]" .这语法是必要的,因为「指向单一元素的指标」与「指向一个阵列的指标」在语法上并没有法区脱离来.

6、万一我忘了将 "[]" 用在 "delete" 由 "new Fred[n]" 配置到的阵列,会发生什麽事?

灾难.这是程式者的--而不是编译器的--责任,去确保 new[] 与 delete[] 的精确配对.若你弄错了,编译器不会产生任何编译期或履行期的错误讯息.堆积(heap)被破坏是最大概的终局,或是更糟的,你的程式会当掉.

7、成员函数做 "delete this" 的行动是合理的(并且是好的)吗?

只要你当心的话就没事.所谓的「当心」是:

1) 你得 100% 肯定 "this" 是由 "new" 配置来的(而非 "new[]",亦非自订的  "new" 版本,一定如果最原始的 "new").

2) 你得 100% 肯定该成员函数是此物件最後一个会去呼唤的.

3) 做完自杀的行动 ("delete this;") 後,你不能再去碰 "this" 的物件了,包含资料及运作行为在内.

4) 做完自杀的行动 ("delete this;") 後,你不能再去碰 "this" 指标了.换句话说,你不能查看它、将它与其他指标或是 NULL 相对比、印出其值、对它转型、对它做任何事情.

很自然的,这项告诫也实用於:当 "this" 是个指向基底类别的指标,而解构子不是virtual 的场所.


  以上是“<b>关于指针和内存的几个问题</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .