struct initialisieren?
-
poiuzwerf schrieb:
new hat mit malloc übrigens gar nichts zu tun.
In vielen Implementierungen wird intern malloc verwendet. Die Diskussion gab's schon öfter...
-
bzw. wenn du die struct nicht ändern kannst, schreib eine initialisierungsfunktion.
void initT(T& bla) { bla.intvalue = 0; }
-
Laut wiki schon.
Der Haken: Ich hab ein automatisch generiertes c-struct, da hilft mir kein konstruktor, nur ist es schwierig ein c-struct, das mit calloc alloziiert worden ist, in einen smart pointer zu stopfen
Edit: Nicht so schnell: Das per Hand initliaiseren will ich umgehen, ist ne Menge arbeit.
memset werd ich angucken
-
_matze schrieb:
Du könntest doch mit memset null-initialisieren.
nein, tu das lieber nicht.
_matze schrieb:
In vielen Implementierungen wird intern malloc verwendet. Die Diskussion gab's schon öfter...
new hat mit malloc nichts zu tun. was "viele implementierungen" tun, interessiert nicht die bohne.
-
Es klappt mit memset, aber wieso soll ich es nicht tun?
-
Seikilos schrieb:
Es klappt mit memset, aber wieso soll ich es nicht tun?
struct bumm { std::string patsch; };
-
in nem c struct?
-
Seikilos schrieb:
in nem c struct?
wenn du 100% sicher bist, dass da immer nur PODs drin stecken, kannst du es mit memset machen. dann könntest du aber auch gleich calloc benutzen.
-
Ja, aber wie kann ich dann den speicher in nem smart pointer verwalten?
auto_ptr macht doch ein delete, aber da es nicht mit new erzeugt worden ist?
-
Seikilos schrieb:
Ja, aber wie kann ich dann den speicher in nem smart pointer verwalten?
auto_ptr macht doch ein delete, aber da es nicht mit new erzeugt worden ist?
Wenn Du die Dinger wirklich in einem auto_ptr verwalten willst, kannst Du eine Initialisiererfunktion schreiben:
struct SomeStrangeStruct { int intVal; float floatVal; char charArr[4]; double* doublePtr; }; SomeStrangeStruct* initializerFunkt() { SomeStrangeStruct* structure = new SomeStrangeStruct(); structure->intVal = 0; structure->floatVal = 0.0f; std::fill(structure->charArr, structure->charArr + sizeof(structure->charArr), 'a'); structure->doublePtr = NULL; return structure; } //... std::auto_ptr<SomeStrangeStruct> structAutoPtr(initializerFunkt());
-
Dies tu ich in der Tat auch, nur das die init mehr als 100 Zeilen hätte und ich dies gerne vermeiden würde. memset kommt mir da schon zu gute.
Ich wollte nur sichergehen, dass ich es richtig verstanden habe, dass calloc und smart ptr keine freunde wären

-
Seikilos schrieb:
Dies tu ich in der Tat auch, nur das die init mehr als 100 Zeilen hätte und ich dies gerne vermeiden würde. memset kommt mir da schon zu gute.
Ich wollte nur sichergehen, dass ich es richtig verstanden habe, dass calloc und smart ptr keine freunde wären

Ne, sind sie nicht. c|malloc + delete ist einem ziemlich schlechte Kombination. Die harmonieren irgendwie nicht.

-
Seikilos schrieb:
Ich wollte nur sichergehen, dass ich es richtig verstanden habe, dass calloc und smart ptr keine freunde wären

Wenn ich mich noch richtig erinnere, so hat die Loki-Bibliothek aber durchaus Smartpointer die man für die alloc-Geschichten "konfigurieren" kann (Bereich Delete policies, Loki::DeleteUsingFree< P >).
Wobei ich die Loki-Bibliothek zumindestens von ihrer Verständlichkeit nicht wirklich gut finde (Ich finde auch das Buch "Modern C++ Design" als zu knapp von den Ausführungen her, und imho hätten auch noch Beispiele aus der Realität gut getan; Zumindestens wäre es dann leichter "verdaulich").
cu André
-
asc schrieb:
Seikilos schrieb:
Ich wollte nur sichergehen, dass ich es richtig verstanden habe, dass calloc und smart ptr keine freunde wären

Wenn ich mich noch richtig erinnere, so hat die Loki-Bibliothek aber durchaus Smartpointer die man für die alloc-Geschichten "konfigurieren" kann (Bereich Delete policies, Loki::DeleteUsingFree< P >).
Wobei ich die Loki-Bibliothek zumindestens von ihrer Verständlichkeit nicht wirklich gut finde (Ich finde auch das Buch "Modern C++ Design" als zu knapp von den Ausführungen her, und imho hätten auch noch Beispiele aus der Realität gut getan; Zumindestens wäre es dann leichter "verdaulich").
cu André
Du erinnerst dich richtig. Im Rahmen der Storage Policy kann man durchaus auch ein free() einbauen.
Was Verständlichkeit etc. angeht kann ich dir aber nicht zustimmen. Es ist zwar Anfangs etwas schwierig die Konzepte zu verinnerlichen die im "täglichen Gebrauch" nicht so häufig vorkommen, aber wenn man das hat ist die Bibliothek nicht komplizierter als andere auch, und das Buch hat durchaus Beispiele, konzentriert sich allerdings auf die Facts statt sich in einen rundum-Sorglos Paket für die Anwendungsbeispiele zu verzetteln...