malloc und constructor
-
Wenn man malloc verwenden muß, weil das halt nicht mit new geht;
man also schreibt:Klassentyp* PNeue_Klasse=(Klassentyp*) malloc(groesse_der_Klasse);
dann wird kein Constructor aufgerufen.
Kann man das noch nachhohlen, bzw. den Constructor in der gleichen Zeile aufrufen?
-
jo, kann man:
CT *p; // allozieren new (p) CT;
-
Okay kann sein das ichs falsch verstanden habe...
Ich habe mit malloc bereits den Speicher reserviert.
New würde das doch dann nochmal machen?
-
du kannst new auch einfach nur einen konstruktor (in bereits allozierten speicher) aufrufen lassen:
foobar *foo = alloc_memory_fuer_foobar (); new (foo) foobar;
-
Original erstellt von Janko:
Okay kann sein das ichs falsch verstanden habe...JO! Das // allozieren hieß: hier dein allozierungs-code. Naja...
-
new / delete: C++
malloc & konsorten: Centscheid dich für eins
-
@Korbinian: naja, operator new überladen ist ja sogut wie sinnlos, daher, wenn man zB ein void *ultrasuperhexadupayippiyippioptimizedmalloc(std::size_t) hat, muss man wohl auch placement-new verwenden.
-
hm, vielleicht hab ich auch die frage einfach falsch verstanden. aber wann kann man denn kein new verwenden?
-
Original erstellt von Janko:
Wenn man malloc verwenden muß, weil das halt nicht mit new geht...was bitteschön kann man mit malloc machen und mit new nicht?
-
Neben der Möglichkeit, dass er gar nicht das normale malloc verwendet, gibt es noch die, dass er ein Programm ohne Standard-Library schreibt.
-
was bitteschön kann man mit malloc machen und mit new nicht?
mit malloc reserviert man eine bestimmte Größe an Speicher und weißt sie einem Pointer zu.
Mit new reserviert man die Größe an Spiecher die man für ein Obejekt/(e) braucht-> weiß man nicht wie ein Objekt aufgebaut ist, kennt aber seine Größe muß man malloc nehmen.
-
hä?
und wann bitteschön hast du objekte von denen du nur die grösse kennst?
wenn man das:Klassentyp* PNeue_Klasse=(Klassentyp*) malloc(groesse_der_Klasse);
schreiben kann kann man auch das:
Klassentyp* PNeue_Klasse=new Klassentyp;
schreiben... bring mal ein konkretes beispiel wo das nicht funktioniert...
vorallem wenn du nur die grösse einer klasse weisst wie willst du dann irgendeinen konstruktor aufrufen???ansonsten macht
Klassentyp* PNeue_Klasse= reinterpret_cast<Klassentyp*>(char new[groesse_der_Klasse]);
etwa das selbe wie das malloc zeugs einfach auch hier ohne konstruktoraufruf...
[ Dieser Beitrag wurde am 04.05.2003 um 20:40 Uhr von japro editiert. ]
-
Original erstellt von Janko:
**[quote]
was bitteschön kann man mit malloc machen und mit new nicht?
****
mit malloc reserviert man eine bestimmte Größe an Speicher und weißt sie einem Pointer zu.
Mit new reserviert man die Größe an Spiecher die man für ein Obejekt/(e) braucht-> weiß man nicht wie ein Objekt aufgebaut ist, kennt aber seine Größe muß man malloc nehmen.**[/QUOTE]
Also new reserviert nicht nur Platz für Objekte; wenn man
char * point = new char[XX]; nimmt entspricht das = (char)malloc(XX),
man spart sich halt bei new, dass man wissen muss wie groß ein Typ, eine Struktur oder eine Klasse ist! Und das man den Pointer nicht wandeln muss. Man gibt bei new halt nur die Anzahl der gewünschten Typen/Strukturen/Klassen und nicht direkt die Byteanzahl an.Also das was Janko über malloc schreibt trifft exakt auch auf new zu, nur wie man es anwendet ist anders.(new kann halt noch mehr)
Grüße Flow
-
Original erstellt von Janko:
[quote]-> weiß man nicht wie ein Objekt aufgebaut ist, kennt aber seine Größe muß man malloc nehmen.ganz blöde Frage:
wenn ich die Größe des Objektes kenne, aber nicht den Aufbau, dann eh... ne keine Ahnung wie das gehen soll.Um ein Objekt anzulegen muss der Compiler die deklaration kennen!
Wenn man mit Zeigern arbeitet reicht sogar ein Prototyp.Allerdings kann ich keine Methode eines objektes aufrufen von dem ich nur den prototypen kenne!
Und der Ctor ist IMHO eine Methode des Objektes.
Wie willst du also einen Ctor aufrufen ohne den inneren aufbau der Klasse zu kennen? - sorry, ich peils nicht.
-
vielleicht will er den speicher auslesen? (wäre die einzig sinnvolle sache, bei der ich was ohne zu wissen aus dem ram holen will. andererseits geht das nicht mit malloc...)