Frage

Hey guys. Ich arbeite an älteren Code für meine Arbeit zu fixieren. Es wird derzeit in C ++ geschrieben. Sie verwandelten statische Zuordnung dynamischer aber er bearbeiten nicht die memsets / memcmp / memcpy. Dies ist meine erste Programmierung Praktikum bei meinem newbe artigen Frage so entblößen.

Der folgende Code ist in C, aber ich will es in C ++ haben (ich gelesen, dass malloc in C nicht gute Praxis ++). Ich habe zwei Szenarien: Erstens, wir f erstellt haben. Dann Sie & f zu füllen, um mit Null. Der zweite ist ein Zeiger * pf. Ich bin mir nicht sicher, wie man alle 0'en wie das vorherige Beispiel in C einzustellen pf ++.

Könnten Sie tun pf = new foo statt malloc und dann memset(pf, 0, sizeof(foo)) nennen?

struct foo { ... } f;
memset( &f, 0, sizeof(f) );

//or

struct foo { ... } *pf;
pf = (struct foo*) malloc( sizeof(*pf) );
memset( pf, 0, sizeof(*pf) );
War es hilfreich?

Lösung

Ja, aber nur, wenn foo ein POD ist. Wenn es virtuelle Funktionen oder irgendetwas anderes fern C ++ ish, nicht memset verwenden auf sie bekam, seit es wird alles über die Interna der Struktur / Klasse stampfen.

Was möchten Sie wahrscheinlich statt Memset zu tun ist, geben foo ein Konstruktor explizit initialisieren ihre Mitglieder.

Wenn Sie neu nutzen wollen, vergessen Sie nicht die entsprechenden Lösch. Noch besser zu Einsatz Shared_ptr wäre:)

Andere Tipps

Können Sie? Ja möglicherweise. Sollten Sie? Nr.

Während es wahrscheinlich arbeiten, werden Sie den Zustand zu verlieren, dass der Konstruktor für Sie gebaut hat. Rechnet man dazu, was passiert, wenn Sie sich entscheiden, eine Unterklasse dieser Struktur zu implementieren? Dann verlieren Sie die Vorteile wiederverwendbaren Code, C ++ OOP Angebote.

Was Sie sollten stattdessen tun ist, einen Konstruktor erstellen, die die Mitglieder für Sie initialisiert. Auf diese Weise, wenn Sie diese Struktur sublass später auf der ganzen Linie, verwenden Sie ihn nur Konstruktor zur Hilfe bei den Unterklassen zu konstruieren. Dies ist kostenlos, sicher Code! verwenden Sie es!

Edit: Der Nachteil dabei ist, dass, wenn Sie bereits einen großen Codebasis haben, ändern sie nicht, bis Sie die structs starten Subklassen. Es funktioniert wie es jetzt ist.

Ja, das funktionieren würde. Allerdings glaube ich nicht malloc unbedingt schlechte Praxis ist, und ich würde es nicht nur um es zu ändern zu ändern. Natürlich sollten Sie sicherstellen, dass Sie immer die Zuweisungsmechanismen entsprechen richtig (neuen-> löschen, malloc-> frei, usw.).

Sie können auch einen Konstruktor auf die Struktur hinzufügen und dass die Felder zu initialisieren verwenden.

Sie könnten neue foo (wie der normale Weg in C ++) und implementieren einen Konstruktor, der initialisiert eher foo als die Verwendung von Memset .

z.

struct Something
{
    Something()
        : m_nInt( 5 )
    {

    }

    int m_nInt;
};

Sie auch nicht vergessen, wenn Sie mit neue nennen Löschen , wenn Sie mit dem Objekt fertig sind sonst werden Sie mit Speicherlecks beenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top