2017-10-01 14 views
-3

私が誤ってC++で書いた:mallocは戻り値の型をチェックしていませんか?

Tree *tree = (Tree *)malloc(sizeof (TreeNode)); 

TreeTreeNodeは、二つの異なるカスタムデータ構造です。しかし、それは何の問題もなく、なぜ働いていたのですか?将来の問題は何か?

+0

それは依存しています。++必須ではありますが、 'static_cast 'のようなものです.c threは非常に有名な質問です。 C++では、 'malloc()'がコンストラクタを呼び出さないので、代わりに 'new'を使います。 –

+1

C++では、本当に 'malloc'や友人を使ってはいけません。注意しないと*未定義の動作*につながる可能性があります。 CとC++は、セマンティクスや振る舞いについて言えば、非常に異なる***の2つの言語です。 –

+0

@IharobAlAsimiありがとうございます。私はあなたのポイントを取得していない "それは依存している、C + +それは必須ですが、static_castのように"あなたはさらに説明することができます。 –

答えて

0

は基本的にあなたが常にポインタ型にvoid *からreinterpret_cast<>を行うことができ、およびコンパイラは、以下のことを確認してください注意でしょうもない本当の問題は、あなたがか悪いかではないかもしれませんmalloc()のために間違ったsizeパラメータを使用していることであることを、それが小さいか大きいかによって異なります。しかし、この状況ではtreeの初期化に関連する問題は間違ったタイプではありませんが、C++では、以下で簡単に説明する理由で未定義の動作を引き起こす大きな危険にさらされます。

一般的には、経験豊富なCプログラマは

Tree *tree = malloc(sizeof *tree); 

を行うだろうが、これはあなたが常に正しいサイズを割り当てます

Tree *tree = static_cast<Tree *>(malloc(sizeof *tree)); 

を必要とするC++では、++ C無効です。しかし、これは、型が式の両側に表示されることを必要とすることに注意してください。これは、必ずしも必要ではありません。

今本当のC++これを行う方法があり、

Tree *tree = new Tree; 

これでしょう、

  1. は、メモリの正しい量を割り当てます。
  2. タイプセーフである(の場合はTree *tree = new TreeNode;とするとエラーになります)。
  3. Treeのコンストラクタを呼び出します。

手動でfree()このメモリが、deleteとする必要がmalloc()と同じようにあなたはそれなしでほとんどのことを行うことができますので、代わりに、要するにこの

delete tree; 

のように、malloc()はほとんどない必要なのC++ではありません。時には便利ですが、特にライブラリライターにとっては役に立ちますので、アプリケーション作成者はそれを使用しないでください。

関連する問題