Richtigen Weg zuweisen Zeiger in c++

EDIT: ich weiß, in diesem Fall, wenn es eine tatsächliche Klasse wäre ich besser dran, nicht, den string auf dem heap. Jedoch, dies ist nur ein Beispiel-code, um sicherzustellen, dass ich die Theorie verstehen. Der eigentliche code wird ein rot-schwarz-Baum mit allen Knoten gespeichert, auf dem heap.

Möchte ich sicherstellen, dass ich über diese grundlegenden Vorstellungen zu korrigieren, bevor (ich komme aus einer Java - /Python-hintergrund). Ich habe die Suche im Netz, aber habe nicht gefunden eine konkrete Antwort auf diese Frage noch.

Wenn Sie neu zuordnen, die einen Zeiger auf ein neues Objekt werden müssen, rufen Sie löschen auf das alte Objekt zunächst um Speicherlecks zu vermeiden? Meine intuition sagt mir ja, aber ich will eine konkrete Antwort, bevor Sie fortfahren.

Zum Beispiel lassen Sie sagen, Sie hatte eine Klasse, die gespeichert, ein Zeiger auf einen string

class MyClass
{
private:
    std::string *str;

public:
MyClass (const std::string &_str)
{
    str=new std::string(_str);
}

void ChangeString(const std::string &_str)
{
    //I am wondering if this is correct?
    delete str;
    str = new std::string(_str)

    /*
     * or could you simply do it like:
     * str = _str;
     */ 
}
....

In der ChangeString Methode, welche wäre die richtige?

Ich glaube, ich bin immer hängen geblieben, wenn Sie nicht verwenden Sie das neue Schlüsselwort für die zweite Möglichkeit, es wird noch kompilieren und ausführen, wie Sie es erwartet haben. Tut dies einfach überschreiben die Daten, die dieser pointer zeigt? Oder ist es etwas anderes tun?

Jede Beratung wäre sehr appricated 😀

  • Es ist wahrscheinlich, dass Sie sollten nicht die Zuweisung einer Zeichenfolge, die mit new in den ersten Platz. Hast du irgendeinen besonderen Grund?
  • Lesen Sie die Bearbeiten oben auf der Seite
  • Eine Natürliche Sache zu tun hier, wäre noch: *str = _str; (keine Notwendigkeit, wegwerfen, eine string-und die andere erstellen, wenn Sie wollen einfach nur zuordnen, um den Inhalt)
  • Das ist ziemlich viel, was meine Frage-Zentren über. Wenn ich es auch so gemacht hat, würde ich haben, bekomme ich ein memory-leak? Ab in die Kommentare unten, es klingt wie ich möchte.
  • Wenn Sie möchten, ared-schwarz-Baum, was ist Los mit std::map?
  • der ganze Zweck des rot-schwarz-Baum ist, nur um mich intruduced, um die Sprache/syntax/etc. Jedes mal, wenn ich abholen eine neue Sprache beginne ich mit dem Bau eines rot-schwarz-Baum, um sicherzustellen, dass ich die Grundlagen zu verstehen (es ist so ziemlich mein "Hallo Welt")
  • Natürlich werden Sie nicht bekommen einen memory-leak mit *str = _str; (weil std::string sich nicht Auslaufen). Beachten Sie, dass dies mit den bestehenden Objekte, nicht Adressen. - @Neil: Alle C++ - Programmierer sollte in der Lage sein, Speicherverwaltung manuell und Umsetzung einer RAII-Klasse mit eingebauten Konstrukte, so gibt es nichts falsch diese Dinge zu tun, als übung.
  • Danke, das ist genau das, was ich gesucht hatte (war nicht sicher, ob es überschreiben, das Objekt der Zeiger zeigte auf, oder erstellen Sie eine neue irgendwo was in einem memory-leak). Es ist jetzt mein Verständnis, dass '*pObject = DifferentObject' überschrieben werden alte Objekt pObject Punkte zu, und wird nicht in ein memory-leak. Dank
  • Es ist nicht akkurat zu sagen, dass *pObject = DifferentObject überschreibt das alte Objekt. Er ruft den Zuweisungsoperator der pObject, die wahrscheinlich wird, kopieren Sie die relavent information aus DifferentObject. (Im Fall von std::string, ja, pObject wird am Ende mit dem gleichen Zeichen wie DifferentObject hat.)
  • Einfach in der Lage zu hacken zusammen ein rot-schwarz-Baum, der kompiliert und scheint zu funktionieren, nicht wirklich lehrt Sie alles nützliche über C++. In C++, die Befriedigung der compiler ist die am wenigsten Ihrer Probleme. Schreiben Sie eine rot-schwarz-Baum als eine Lernübung ist eine feine Idee, aber um wirklich etwas lernen, müssen Sie, um sicherzustellen, dass es ist 1) richtig und 2) einigermaßen idiomatischen C++. Das erstere ist schwer zu überprüfen, auf Ihre eigenen, und das zweite ist unmöglich. Was werden Sie tun, um sicherzustellen, dass Sie etwas lernen aus dieser übung?

InformationsquelleAutor vimalloc | 2010-04-16
Schreibe einen Kommentar