operator new benutzt malloc???
-
Hi,
ich bin irgendwie verwirrt! ich dachte new wäre etwas eigenständiges und würde nicht auf ANSI C zurückgreife, doch da hab ich mich wohl geirrt...
// newop operator new(size_t) for Microsoft C++ #include <cstdlib> #include <new> _C_LIB_DECL int __cdecl _callnewh(size_t size) _THROW1(_STD bad_alloc); _END_C_LIB_DECL void *__cdecl operator new(size_t size) _THROW1(_STD bad_alloc) { // try to allocate size bytes void *p; while ((p = malloc(size)) == 0) if (_callnewh(size) == 0) _STD _Nomemory(); return (p); } /* * Copyright (c) 1992-2001 by P.J. Plauger. ALL RIGHTS RESERVED. * Consult your license regarding permissions and restrictions. V2.3:0009 */
Auf den code bin ich gestoßen als ich bei .NET mit dem Debugger hantiert habe.
-
Warum sollte new nicht malloc benützen dürfen?
-
weil doch immer und überall gepriesen wird wenn man sagt "new benutzt intern doch malloc aus C" das dem nicht so sei und man total zusammen geschissen wird.
-
*** schrieb:
weil doch immer und überall gepriesen wird wenn man sagt "new benutzt intern doch malloc aus C" das dem nicht so sei und man total zusammen geschissen wird.
Ich kenn nur : "In c++ benutzt man new statt malloc und delete statt free!", das macht auch Sinn, da bei malloc bekanntlich keine Konstruktoren aufgerufen werden!
-
wo wird denn oben ein Ctor aufgerufen?
-
*** schrieb:
wo wird denn oben ein Ctor aufgerufen?
Warum sollte dort ein Ctor aufgerufen werden?
man beachte: operator new != new
-
man beachte ich habe das hier durch den debugger gejagt und den obringen code bekommen:
int *x = new int;
wieso wird denn da dieser operator new aufgerufen und nicht new aus C++? bzw. gibt es überhautp new aus C++ oder ist das nur so eine neuwertige malloc verklatschung
-
Welchen Ctor willst du denn für int aufrufen?
Es gibt keinen Ctor für int und eine Initialisierung findet auch nicht statt.
-
wenn ich schreibe:
CMyClass *x = new CMyClass;
komm ich zur selben funktion!
-
*** schrieb:
wenn ich schreibe:
CMyClass *x = new CMyClass;
komm ich zur selben funktion!
Und? new wird sich den Speicher über operator new besorgen...
-
aha... also benutzt dieses new was verwendet wird malloc! und es ist nicht wie immer groß rumgeworfen ein eigenständiger befehl!
-
new benutzt malloc, fertig... Der Unterschied ist, dass eben der Constructor aufgerufen wird.
-
*** schrieb:
aha... also benutzt dieses new was verwendet wird malloc! und es ist nicht wie immer groß rumgeworfen ein eigenständiger befehl!
Eine naive Implementation von new wäre:
template<typename T> T* new(size_t size) { T* p=static_cast<T*>(operator new(size * sizeof(T)); for(size_t i=0; i<size; ++i) { new(p+i)(T()); //placement new mit standard ctor } return p; }
new besorgt speicher (zB über operator new, malloc, calloc, realloc, oder sonst irgendwie) und es ruft die passenden Ctors auf.
-
*** schrieb:
aha... also benutzt dieses new was verwendet wird malloc! und es ist nicht wie immer groß rumgeworfen ein eigenständiger befehl!
new ist kein Befehl der rumgeworfen wird sondern ein Operator der Sprache C++.
Die globale Funktion operator new kann, muss aber keinesfalls, malloc verwenden. Das ist dem Implementierer überlassen. Desweiteren kann man als Programmierer die Funktion operator new überladen und damit Einfluss auf das Verhalten des new-Operators ausüben.Shade Of Mine schrieb:
new besorgt speicher (zB über operator new, malloc, calloc, realloc, oder sonst irgendwie) und es ruft die passenden Ctors auf.
new ruft *garanetiert* eine Funktion operator new auf. Entweder die globale, oder aber, falls es sich um die dynamsiche Erstellung eines udts handelt und dieser den op new überlädt, eine statische operator new-Funktion einer Klasse.
Die operator new-Funktion kann intern natürlich malloc oder gibMirFettSpeicherMama aufrufen. Der new-Operator kann aber nicht direkt malloc aufrufen.
-
Ich hatte schon mit Compilern zu tun, bei denen new deutlich schneller war, als malloc+placement new. (Anmerkung: die Objekte waren nicht besonders groß)
-
Helium schrieb:
Ich hatte schon mit Compilern zu tun, bei denen new deutlich schneller war, als malloc+placement new. (Anmerkung: die Objekte waren nicht besonders groß)
Natürlich. Ich würde new ja auch nicht so implementieren - aber zum vorstellen der Vorgänge ist es so ganz praktisch, denke ich.