0

を使用するときに型のキャストを処理する適切な方法がわかりませんmalloc。私は、以下が完全に合法であるObjective Cから来ています:

ALuint * sources;
sources=malloc(sizeof(ALuint)*32);

ただし、C++ では、コンパイラは「互換性のない型 void * から ALuint * に割り当てています」と言います。

から返されたメモリがmalloc特定の型としてキャストされていないことがわかり、C++ は型に厳密であることがわかります。

今、私はこれを行うことができます:

 sources=(ALuint*)malloc(sizeof(ALuint)*32);

しかし、私は自分がそのような方法でキャストすることは決してないと言っているよりもはるかに賢明なコーダーを読んだことがあります。なぜだめですか?そうでない場合、いつ、どのようにして、これを機能させるのに最適な時期または方法ですか?

4

1 に答える 1

3
  1. mallocC++ での使用は避けてください
  2. 必要な場合は、コードをコンパイルするために戻り値の型をキャストする必要#1があります。malloc
  3. 唯一の例外#2は、ターゲット ポインターがポインターであるvoid場合です。
  4. return をキャストしないことmallocは、(議論の余地がありますが) C の良い習慣と考えられています。

したがって、C++ ではキャストが必要です。ただし、使用するキャストのタイプも重要です。C スタイルのキャストであってはなりません。上記のリンクは、キャストのみの必要性を示すものでした。


今、私はこれを行うことができます:

sources=(ALuint*)malloc(sizeof(ALuint)*32);

しかし、私は自分がそのような方法でキャストすることは決してないと言っているよりもはるかに賢明なコーダーを読んだことがあります。なぜだめですか?


C++ では、C スタイルのキャストは、次の順序で C++ キャストにマップするように標準で定義されているためです。最初に成功したものが使用されます。

  1. const_cast
  2. static_cast
  3. static_cast、次に const_cast
  4. 再解釈_キャスト
  5. reinterpret_cast、次に const_cast

ご覧のとおり、c スタイルのキャストは実際にreinterpret_castは、互換性のないポインター型間でキャストできるため、潜在的に危険な結果になる可能性があります。したがって、使用する必要があるmalloc場合:

sources=static_cast<ALuint*>malloc(sizeof(ALuint)*32);
于 2013-02-02T04:56:33.610 に答える