3

C では、への呼び出しの結果を型キャストするのは不適切な形式と見なさmallocれます。ただし、mallocC++での への呼び出しの結果は、型キャストである必要mallocがあるように見えnewます。C++ で返された void ポインターが自動的に昇格され、返された void ポインターが昇格されない理由はありますか?void*newnewmalloc

4

2 に答える 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 に答える