C ++, ist es möglich, einen Konstruktor direkt aufzurufen, ohne neu?
Kann ich anrufen Konstruktor explizit, ohne new
wenn ich bereits einen Speicher für ein Objekt?
class Object1{
char *str;
public:
Object1(char*str1){
str=strdup(str1);
puts("ctor");
puts(str);
}
~Object1(){
puts("dtor");
puts(str);
free(str);
}
};
Object1 ooo[2] = {
Object1("I'm the first object"), Object1("I'm the 2nd")
};
do_smth_useful(ooo);
ooo[0].~Object1(); //call destructor
ooo[0].Object1("I'm the 3rd object in place of first"); //???? - reuse memory
InformationsquelleAutor der Frage osgx | 2010-03-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Art. Sie können Platzierung neue zum ausführen des Konstruktors, die mit bereits zugewiesenen Speicher:
So, du bist immer noch mit der
new
Schlagwort, aber keine Speicherreservierung statt.InformationsquelleAutor der Antwort unwind
Ich glaube, Sie suchen nach Placement-New. Die C++ FAQ Lite hat eine gute Zusammenfassung, wie Sie dies tun. Es gibt ein paar wichtige Punkte aus diesem Eintrag:
#include <new>
zu verwenden, die Platzierung der neuen syntax.InformationsquelleAutor der Antwort Michael Kristofik
Lassen Sie mich Ihnen zeigen, einige der code, wie es getan werden kann, sowohl in den Bau und die Zerstörung
Ich hoffe, diese Zusammenfassung macht die Dinge klarer.
InformationsquelleAutor der Antwort Cthutu
Wörtlich genommen, NEIN, Sie kann es nicht ohne das Schlüsselwort "new". Finden Sie alle Antworten über die neue Platzierung für die Art und Weise zu benutzen, die "neue" Schlüsselwort, um den Konstruktor aufrufen, ohne tatsächlich allokierung von Speicher.
InformationsquelleAutor der Antwort Ben Voigt
Ja, wenn Sie haben Ihre eigenen zugewiesenen Puffer Sie verwenden Sie placement-new. Brian Bondy hat eine gute Antwort hier in einer ähnlichen Frage:
Welche Nutzungen sind für das "placement new"?
InformationsquelleAutor der Antwort itsmatt
Können Sie einen Destruktor, aber der Speicher wird nicht freigegeben werden, und Ihr Anruf wird äquivalent zu einem Aufruf der Funktion. Sie haben sich daran zu erinnern, dass unter der destructor tut 2 Dinge: zerstört-Objekt basierend auf Ihrer Spezifikation und reaktiviert die Erinnerung. Da Sie dtor aufgerufen werden, sowieso für ein Objekt auf dem Stapel reserviert, nannte es zweimal führen kann, dass ein nicht definiertes Verhalten.
InformationsquelleAutor der Antwort vehomzzz
Ja, mit dem placement new - wie oben, aber könnten Sie überlegen, eine zweite Fabrik-Klasse zur Verwaltung der Speicher, auch wenn es bedeutet, Sie kopieren ein Objekt. memcpy() ist in der Regel Billig für kleine Gegenstände.
InformationsquelleAutor der Antwort Martin Beckett
Basierend auf Kommentare, das funktioniert nur für Microsoft-C++ - Compiler
Ganz einfach, ohne
new
:Dies funktioniert mit jeder Klasse:
InformationsquelleAutor der Antwort lama12345