Wie kann ich in C ++ 11 neu aufrufen und genügend Speicher für das Objekt reservieren?

8

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 ...

    
Fabien 30.05.2013, 14:32
quelle

4 Antworten

11

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:

%Vor%

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 :

reservierten Speicher verwenden %Vor%

Beachten Sie auch, dass Sie, wie @Nikos C. und @GManNickG vorgeschlagen wurde, dasselbe mit C ++ - Methode tun können a href="http://en.cppreference.com/w/cpp/memory/new/operator_new"> malloc :

%Vor%     
zakinster 30.05.2013, 14:38
quelle
8

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.

    
Sebastian Redl 30.05.2013 16:01
quelle
1

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 .

    
NtscCobalt 30.05.2013 14:58
quelle
1

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.

    
Alex 31.05.2013 17:11
quelle

Tags und Links