C++ コードとマージしたい malloc ステートメントを含む C コードがいくつかあります。
C++ で malloc の呼び出しを型キャストする必要があるのはいつ、なぜなのか疑問に思っていました。
例えば:
char *str = (char*)malloc(strlen(argv[1]) * sizeof(char));
C++でmallocの呼び出しを型キャストする必要があるのはいつですか?
に代入しないときは常にvoid *
、void *
C のように他のポインター型に暗黙的に変換されないためです。しかし、本当の答えは、そもそもC++で使用しないことです。malloc
new
の代わりに使用することをお勧めしているわけではありませんmalloc
。最新の C++ コードではnew
控えめに使用するか、可能であれば完全に使用しないようにする必要があります。すべての使用を非表示にするnew
か、非プリミティブ型を使用する必要があります ( std::vector
Xeo で言及されているように)。私の経験が限られているため、この方向でアドバイスを与える資格はありませんが、この記事と「C++ avoid new」の検索が役立つはずです。次に、次のことを調べます。
C ライブラリをコンパイルします。C++ ライブラリをコンパイルします。それらを使用する「メイン」プログラムでうまく機能するようにします。ポイントは、混合コードベースを維持している場合、おそらく純粋な C のものを C++ のものから分離したいということです。そうしないと、C のものが C にしか見えない C++ のものに変わってしまいます。
malloc
まず、ほとんどすべての状況で C++ プログラムでは使用しませんnew
が、必要なときにコンストラクターが確実に呼び出されるようにするため、代わりに使用することをお勧めします。
ただし、従来の理由でできるだけ多くの書き換えを避けようとしている場合は、ポインターに割り当てられていない malloc
呼び出しをキャストする必要があります。void*
そのコードを変更できる場合は、new
代わりに使用する方がおそらく良いので、次のようになります
char* str = new char;
これは、C のようにキャストする必要がなく、必要なメモリの大きさを指定する必要がないことを意味します。また、これが のようなオブジェクトであった場合std::string
、 を使用するときにコンストラクターを呼び出さないでくださいmalloc
。これはポインターで使用するためにメモリを予約するだけstr
なので、new
メモリを再利用するときに常に適切な方法を使用できる場合は、常に C++ で使用するのが最適です。あなたならnew
あなた、あなたdelete
ならmalloc
あなたfree
。free
'd'されたメモリ上で使用する場合new
、そのオブジェクトのデストラクタは呼び出されません。
malloc
常に a を返すvoid*
ため、すべてをキャストする必要があります (C++ は C よりも強力な型チェックを行い、これを自動的に行わないため)
C を使用している場合は、コードを明確にするためにすべてをキャストします。
また、C++ で自由に使い続けてmalloc()
ください。それには正当な理由があります。
、、などmalloc()
のすべてのインスタンスを見つけるためにマージしているコードを読み続ける時間がない限り、すべてのコードをすべて新しいものに書き直してすべての C コードを C++ に変換すると、コードに多くのエラーが発生する傾向があります。 . その上に。malloc()
free()
calloc()
混ぜたり、malloc()
混ぜたり、壊れたりしないでください。delete
new
free()