2012-03-07 12 views
11

Definicja nowego w < nowy> nagłówku jest:Dlaczego new nie wymaga rzutowania na wskaźnik, mimo że wymaga tego malloc?

void* operator new(size_t); 

I definicja malloc jest, jak stwierdził:

void* malloc(size_t); 

Teraz, jak C++ jest silnie wpisany język, to wymaga rzut od programisty, aby przekształcić void * wskaźnik w typ wymagany przez programistę ... W malloc musimy wykonać rzut, ale nie w nowym, ale oba zwracają void * wskaźnik. Czemu?

+0

to sprawdzić http://www.codeproject.com/Articles/6555/To-new-is-C-To-malloc -is-C-To-mix-one-is-is-sin – pyCthon

+0

również ten http://stackoverflow.com/questions/184537/in-what-cases-do-i-use-malloc-vs-new – pyCthon

+5

Sprawdź również : http://stackoverflow.com/q/1885849/1155650 –

Odpowiedz

12

Ponieważ używasz new, używasz (zwykle) "nowego wyrażenia", które przydziela i inicjalizuje obiekt. Następnie przypisujesz adres tego obiektu do wskaźnika do obiektu tego samego (lub rodzica) typu, który nie wymaga rzutowania. Normalne nowe wyrażenie (tj. Nie nowe miejsce docelowe) będzie wewnętrznie wywoływać operator new, ale wynikiem nowego wyrażenia jest , a nie tylko wynik z operator new.

Jeśli bezpośrednio wywołasz operator new, musisz rzucić jego wynik, aby przypisać wartość zwracaną do wskaźnika bez pustego miejsca, tak jak musisz zrobić z powrotem z malloc.

+1

Czy możesz powiedzieć mi więcej o nowym wyrażeniu ???? – bhuwansahni

+2

Akceptowana [i błyskotliwa :-)] odpowiedź na pytanie, do którego link @Rohit został dołączony, bardziej szczegółowo. –

5

Ponieważ masz złe wrażenie, jak korzystać z malloc. Nie przyjmuje typu jako argumentu, a jedynie rozmiar typu.

C i C++ to różne języki. W C nie trzeba rzutować void* z malloc na typ wskaźnika docelowego. W C++ operator new jest głęboko wbudowany w taki język, że zawsze zwraca wartość odpowiadającą typowi, który podałeś w argumencie.

Zasadą jest dość proste użycie new dla C++ i malloc dla C, nie mieszaj ich.

+0

Jak nowy otrzymuje typ jako argument? – bhuwansahni

+1

@ bhuwansahni, 'new' jest operatorem, a nie funkcją. W miejscu, w którym go używasz, zawsze podajesz mu typ obiektu, który ma zostać przydzielony i skonstruowany. To od kompilatora zależy połączenie. W C dla połączenia z 'malloc' podajesz tylko rozmiar. –

+0

tak, ale deklaracja nowego operatora nie odzwierciedla tego, dlaczego? – bhuwansahni

1

Ponieważ wywołanie operator new jest tylko pojedynczym krokiem wygenerowanym w całym łańcuchu podczas wywoływania new.

Kiedy robisz s=new my_type(args);, kompilator rozwinie, że aby:

s = (my_type*)my_type.operator new(sizeof(my_type)); 
s.my_type(args); //Constructor call 
Powiązane problemy