5

C++ コードとマージしたい malloc ステートメントを含む C コードがいくつかあります。

C++ で malloc の呼び出しを型キャストする必要があるのはいつ、なぜなのか疑問に思っていました。

例えば:

char *str = (char*)malloc(strlen(argv[1]) * sizeof(char));
4

5 に答える 5

18

C++でmallocの呼び出しを型キャストする必要があるのはいつですか?

に代入しないときは常にvoid *void *C のように他のポインター型に暗黙的に変換されないためです。しかし、本当の答えは、そもそもC++で使用しないことです。malloc


newの代わりに使用することをお勧めしているわけではありませんmalloc。最新の C++ コードではnew控えめに使用するか、可能であれば完全に使用しないようにする必要があります。すべての使用を非表示にするnewか、非プリミティブ型を使用する必要があります ( std::vectorXeo で言及されているように)。私の経験が限られているため、この方向でアドバイスを与える資格はありませんが、この記事と「C++ avoid new」の検索が役立つはずです。次に、次のことを調べます。

于 2013-02-27T18:00:04.407 に答える
2

C ライブラリをコンパイルします。C++ ライブラリをコンパイルします。それらを使用する「メイン」プログラムでうまく機能するようにします。ポイントは、混合コードベースを維持している場合、おそらく純粋な C のものを C++ のものから分離したいということです。そうしないと、C のものが C にしか見えない C++ のものに変わってしまいます。

于 2013-02-27T18:22:52.437 に答える
1

mallocまず、ほとんどすべての状況で C++ プログラムでは使用しませんnewが、必要なときにコンストラクターが確実に呼び出されるようにするため、代わりに使用することをお勧めします。

ただし、従来の理由でできるだけ多くの書き換えを避けようとしている場合は、ポインターに割り当てられていない malloc呼び出しをキャストする必要があります。void*

于 2013-02-27T18:02:44.530 に答える
1

そのコードを変更できる場合は、new代わりに使用する方がおそらく良いので、次のようになります

char* str = new char;

これは、C のようにキャストする必要がなく、必要なメモリの大きさを指定する必要がないことを意味します。また、これが のようなオブジェクトであった場合std::string、 を使用するときにコンストラクターを呼び出さないでくださいmalloc。これはポインターで使用するためにメモリを予約するだけstrなので、newメモリを再利用するときに常に適切な方法を使用できる場合は、常に C++ で使用するのが最適です。あなたならnewあなた、あなたdeleteならmallocあなたfreefree'd'されたメモリ上で使用する場合new、そのオブジェクトのデストラクタは呼び出されません。

于 2013-02-27T18:11:10.220 に答える
0

malloc常に a を返すvoid*ため、すべてをキャストする必要があります (C++ は C よりも強力な型チェックを行い、これを自動的に行わないため)

C を使用している場合は、コードを明確にするためにすべてをキャストします。

また、C++ で自由に使い続けてmalloc()ください。それには正当な理由があります。

、、などmalloc()のすべてのインスタンスを見つけるためにマージしているコードを読み続ける時間がない限り、すべてのコードをすべて新しいものに書き直してすべての C コードを C++ に変換すると、コードに多くのエラーが発生する傾向があります。 . その上に。malloc()free()calloc()

混ぜたり、malloc()混ぜたり、壊れたりしないでください。deletenewfree()

于 2013-02-27T18:00:20.590 に答える