Ich habe eine Klasse, die so beschrieben wird:
%Vor%Ich kann das Design dieser Klasse nicht ändern.
Wie kann ich eine Instanz dieser Klasse erstellen? Bevor ich den Konstruktor aufrufen kann, muss ich dafür sorgen, dass genügend Speicher reserviert wird, um seine Daten zu speichern. Er muss also auf dem Heap liegen, nicht auf dem Stack. Ich denke, ich möchte etwas wie
%Vor%Aber ich kann keinen Weg finden, es zum Laufen zu bringen.
EDIT: wie Kommentatoren bemerkt haben, ist dies kein sehr gutes Gesamtdesign (mit nicht standardmäßigen Tricks wie data[0]
), leider ist dies eine Bibliothek, die ich benutzen muss ...
Sie könnten malloc
des Speichers für das Objekt verwenden und dann ein placement new
verwenden, um das Objekt in dem Objekt zu erstellen zuvor zugeordneter Speicher:
Beachten Sie, dass Sie% ce_de% nicht verwenden können, um dieses Objekt zu zerstören. Sie müssten den Destruktor manuell aufrufen und dann delete
für den mit free
:
Beachten Sie auch, dass Sie, wie @Nikos C. und @GManNickG vorgeschlagen wurde, dasselbe mit malloc
:
Sie haben eine Bibliothek, die das erledigt, aber keine Werksfunktion liefert? Für die Schande!
Wie auch immer, während Zakinsters Methode richtig ist (ich würde Operator direkt anrufen, anstatt ein Array von Zeichen neu zu schreiben), ist es auch fehleranfällig, also sollten Sie es einpacken.
%Vor%Ja, hier ist ein bisschen Overhead, aber die meisten Sachen sind wiederverwendbar.
Wenn Sie wirklich faul sein wollen, benutzen Sie einfach std::vector<Foo>
. Es wird mehr Platz brauchen (ich denke 3 Zeiger anstelle von 1), aber Sie erhalten alle Vorteile eines Containers und wirklich keine Nachteile, wenn Sie wissen, dass es nie in der Größe ändern wird.
Ihre Objekte werden bei Ihrer Definition beweglich sein, so dass Sie Folgendes sicher tun können, um die Neuzuordnung des Vektors während der ersten Füllung zu vermeiden ...
%Vor% Da std :: vector zusammenhängend ist, können Sie auch einfach sicher in die Datei memcopy einfügen, da Ihre Objekte trivial-copyable
Ich denke, eine gute C ++ - Lösung besteht darin, rohen Speicher mit new zu erhalten und dann placement new zu verwenden, um Ihre Klasse darin einzubetten.
Das Speichern von Rohdaten funktioniert wie folgt:
%Vor%Das Objekt im empfangenen Speicher zu konstruieren funktioniert folgendermaßen:
%Vor%Denken Sie daran, dass dies auch bedeutet, dass Sie den Ort manuell säubern müssen.
%Vor% Meine persönliche Meinung ist, dass es schlecht ist, malloc
und free
in neu geschriebenem C ++ Code zu verwenden.
Tags und Links c++ c++11 memory-management