C++ kostenlos alle verwendeten Speicher von struct

Kurze Frage; habe ich gegoogelt um und fand einige Antworten schon, aber ich bin ein bisschen paranoid, so will ich, um sicher zu sein.

Betrachten Sie diese situation:

struct CoordLocation
{
    float X;
    float Y;
    float Z;
};

int main()
{
    CoordLocation *coord = new CoordLocation();
    delete coord;
    return 0;
}

Wird der Aufruf von delete auch klar, der Speicher verwendet, die durch die Felder X, Y, Z? Einige Antworten fand ich schon erwähnt, dass ich würde Sie einfach löschen Sie die ZEIGER, nicht die tatsächlich referenzierte Objekt auf diese Weise.
Was ist, wenn...

struct CoordLocation
{
    float *X;
    float *Y;
    float *Z;
};

int main()
{
    CoordLocation *coord = new CoordLocation();
    delete coord;
    return 0;
}

Und was ist, wenn ich manuell den Speicher frei, der für jedes Objekt innerhalb der struct-Konstruktor/Destruktor?

struct CoordLocation
{
    CoordLocation()
    {
         *X = new float;
         *Y = new float;
         *Z = new float;
    }
    ~CoordLocation()
    {
         delete X; delete Y; delete Z;
    }
    float *X;
    float *Y;
    float *Z;
};

int main()
{
    CoordLocation *coord = new CoordLocation();
    delete coord;
    return 0;
}

Ich bemerkt, dass in einer einfachen situation, wie zum Beispiel:

   float *a = new float;
   *a = 5.0f;
   printf("%f", *a);
   delete a;
   printf("%f", &a);

printf drucken würde 5.0, so wird die variable hingewiesen, die durch eine nicht genau zerstört.

Also meine Frage ist:
Wie kann ich zuverlässig frei (wie in keine Speicherverluste) ALLE benutzten Speicher der struct in diesem Fall?

struct CoordLocation
{
    float X;
    float Y;
    float Z;
};

int main()
{
    CoordLocation *coord = new CoordLocation();
    delete coord;
    return 0;
}

Dank!

  • Ihre zweite printf ist ein wenig falsch (format-Identifikator nicht übereinstimmen, argument-Typ). Wussten Sie eigentlich schreiben wollen printf("%f", *a);, wie in der ersten printf?
  • Wenn Sie eine aktuelle/moderne compiler, der zuverlässigste Weg, um sicherzustellen, dass die neue'ed Speicher wird korrekt gelöscht, ist die Verwendung eines "smart" Zeiger-Typen zur Verfügung, die in der C++ standard-Bibliothek. std::unique_ptr und std::shared_ptr vollständige Eigentum einer neue ed-Objekt und garantieren, dass das Objekt Sie sind verantwortlich für die nicht zugespielt werden. (Im Idealfall werden Sie nie irgendwelche raw-Zeiger überall in Ihrem code)
  • Danke für den Tipp, auf der unique_ptr. Ich arbeite mit Visual C++ 2008, damit der compiler unterstützt nicht das neue standard - (nicht finden können, unique_ptr in den std-namespace). Ich gehe mit der alten Art, zumindest bis später.
  • Ja, mein Fehler, auf der 2. printf 🙂
InformationsquelleAutor | 2012-04-20
Schreibe einen Kommentar