C では、への呼び出しの結果を型キャストするのは不適切な形式と見なさmallocれます。ただし、mallocC++での への呼び出しの結果は、型キャストである必要mallocがあるように見えnewます。C++ で返された void ポインターが自動的に昇格され、返された void ポインターが昇格されない理由はありますか?void*newnewmalloc
2 に答える
14
あなたはオペレーターと混同operator newしています。生メモリを割り当てて a を返すだけですが、割り当て後にコンストラクターを呼び出して a を返します。newoperator newvoid*new TT*
また、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 に答える