C++ FAQ Lite[16]--自由存储(FreeStore)管理(上)

 

 

[16] 自由存储(Freestore)管理(上)
(Part of C++ FAQ Lite, Copyright ? 1991-2001, Marshall Cline, cline@parashift.com)

简体中文版翻译:申旻nicrosoft@sunistudio.com东日制作室东日文档


FAQs in section [16]:


[16.1] delete p 删除指针 p,还是删除指针所指向的数据 *p?

指针指向的数据。

关键字应该是 delete_the_thing_pointed_to_by。同样的情况也发生在 C中释放指针所指的内存: free(p)实际上是指free_the_stuff_pointed_to_by(p)

TopBottomPrevious sectionNext section ]


[16.2] 可以 free() 一个由 new 分配的指针吗?可以 delete 一个由 malloc() 分配的指针吗?

不!

在一个程序中同时使用 malloc() delete 或者同时使用 new free() 是合情合理合法的。但是,对由 new 分配的指针调用 free(),或对由 malloc() 分配的指针调用 delete,是无理的、非法的、卑劣的。

当心!我偶尔收到一些人的e-mail,他们告诉我在他们的机器 X 上和编译器 Y 上工作正常。但这并不能使得它成为正确的!有时他们说:“但我只是用一下字符数组而已”。即便虽然如此,也不要在同一个指针上混合malloc()delete,或在同一个指针上混合newfree()。如果通过p = new char[n]分配,则必须使用delete[] p;不可以使用free(p)。如果通过分配p = malloc(n),则必须使用free(p);不可以使用delete[] pdelete p!将它们混合,如果将代码放到新的机器上,新的编译器上,或只是同样编译器的新版本上,都可能导致运行时灾难性的失败。

记住这个警告。

TopBottomPrevious sectionNext section ]


[16.3] 为什么要用 new 取代原来的值得信赖的 malloc()

构造函数/析构函数,类型安全,可覆盖性(Overridability)。

  • 构造函数/析构函数:与 malloc(sizeof(Fred))不一样,new Fred() 调用 Fred 的构造函数。同样,delete p 调用 *p 的析构函数。
  • 类型安全:malloc() 返回一个没有类型安全的 void*new Fred() 返回一个正确类型(一个 Fred*)的指针。
  • 可覆盖性:new 是一个可被类重写/覆盖的算符(operator),而 malloc() 在类上没有可覆盖性。

TopBottomPrevious sectionNext section ]


[16.4] 可以在一个由 new 分配的指针上使用 realloc() 吗?

不可!

realloc() 拷贝时,使用的是位拷贝(bitwise copy )算符,这会打碎许多 C++ 对象。C++对象应该被允许拷贝它们自己。它们使用自己的拷贝构造函数或者赋值算符。

除此之外,new 使用的堆可能和 malloc() realloc() 使用的堆不同!

TopBottomPrevious sectionNext section ]


[16.5] 需要在 p = new Fred()之后检查NULL吗?UPDATED!

[Recently changed so it uses new-style headers and the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nicrosoft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值