C では、への呼び出しの結果を型キャストするのは不適切な形式と見なさmalloc
れます。ただし、malloc
C++での への呼び出しの結果は、型キャストである必要malloc
があるように見えnew
ます。C++ で返された void ポインターが自動的に昇格され、返された void ポインターが昇格されない理由はありますか?void*
new
new
malloc
質問する
240 次
2 に答える
14
あなたはオペレーターと混同operator new
しています。生メモリを割り当てて a を返すだけですが、割り当て後にコンストラクターを呼び出して a を返します。new
operator new
void*
new T
T*
また、C++ とは異なり、C++ では他のポインター型へのmalloc
暗黙的な変換が許可されないため、C++ での結果をキャストする必要があります。C++ ではめったに使用されないことにvoid*
注意してください。void*
于 2013-02-16T13:24:44.460 に答える
4
C ++では、メモリ位置は実際にvoidポインタを介して表現されます。しかし、メモリはオブジェクトと同じではありません。オブジェクトは生きるためにメモリを必要としますが、オブジェクトはそれが存在するメモリとは異なります。
メモリ内にオブジェクトを作成する必要があります。必要に応じて、new
-operatorはメモリとオブジェクトの間で「変換」します。
#include <cstdlib>
void * pm = std::malloc(sizeof(int)); // C-style
void * qm = ::operator new(sizeof(int)); // C++-style
int * po = ::new (pm) int(10); // void pointer goes in...
int * qo = ::new (qm) int(20); // ...object pointer comes out.
// (... class-type objects would need to be destroyed...)
std::free(pm);
::operator delete(qm);
于 2013-02-16T13:46:19.180 に答える