2016-08-26 5 views
0

最近のインタビューで、面接官はfree()を使用して、以前にnewを使用して割り当てられた領域の割り当てを解除できるかどうかを尋ねました。私はイエスに答えました。 :|free()をmalloc()で新しい&deleteで使用することはできますか?

私はペアがmalloc() - free()のように動作することを知っています。& new - delete。

  • しかし、どちらもポインタメカニズムを利用しているので、それらを混在させるのは間違っていますか?

  • 2つのペアを混在させているときに割り当てを解除する必要があります。出来ますか?理論的にも? そして、それらを混在させる可能性のあるシナリオは何でしょうか?

  • 前述の点を実行することが可能な場合は、なぜ新しいもので削除を導入したのですか?あなたやこの特定のトピックを把握する任意の徹底ガイドに利用可能な新しい/削除/ malloc関数/自由のいずれかのソースコードがあるかどう

親切にこのテーマ&に私を啓発、リンクを提供してください。

  • 私の別の好奇心は、削除と警告&問題何ができるか、ですか?
+0

ですが、最後の点はカバーしません。そしてそれらを使用する可能性のあるシナリオ。 – WhiteSword

+1

[new/deleteとmalloc/freeとの違いは何ですか?](http://stackoverflow.com/a/240308)これは、このような質問や他の質問を簡単に参照することができます。 – Basilevs

+0

また、 'delete'と' delete [] 'の違いについて考えてみましょう。 – cdarke

答えて

1
  1. 一つには、彼らは完全に別のヒープを使用しても良いです。私たちの複数のアプリケーションでは、グローバルなnewdeleteがいくつかの追加の簿記を実行するために再定義されています。 freeにポインタを返すとnewが返されますが、これはmallocのものとして認識されません。なぜなら、各メモリブロックの先頭に余分な情報を保持しているからです。標準ライブラリでも同じことができます。
  2. なぜあるはずですか?すでに述べたように、返されるメモリは異なるヒープから来る可能性があるので、一方を使用して他方から割り当てを解除するのは意味がありません。さて、理論的にはグローバルnewオペレータがちょうど薄いラッパーの周りmallocある場合あなたが割り当てている場合はPODの種類とは、それが誤っ仕事newに割り当てられたメモリのためfreeを使用することもできますが、私は本当に見ていません混乱を加えることに加えて、そうすることのポイント(そして潜在的な未定義の振る舞い)。
  3. newおよびdeleteが、非PODタイプを扱う演算子として導入されました。 malloc(または、一般的には1つの関数)が大丈夫ですが、オブジェクトを割り当てる場合は、のものはもっと複雑になります。割り当て機構は、コンストラクタを呼び出さなければならないので、必要なサイズだけでなく、割り当てられたデータの型を認識しなければならない(と同じ。デストラクタを呼び出さなければならないが、newは、デストラクタ)。
関連する問題