C++ Vektor-Heaps anstelle des Stacks
Ich habe ein Interessantes problem. Ich habe eine Funktion in C++, liefert einen vector mit voll-Klassen. Sobald der Vektor zurückgegeben wird, ruft es deconstrustors für jede Klasse, die element im Vektor. Das problem ist ein offensichtlicher, dass die Daten zerstört werden, wo-class-Punkte auf die Zeiger, die freigesetzt werden, wenn ein Objekt zerstört wird. Ich kann nur annehmen, dass die deconstructors genannt werden, da ein Vektor ist, auf dem stack, nicht auf dem heap.
Also die Frage ist: gibt es trotzdem immer wieder Vektor, der aus einer Funktion, ohne dass es zerstört wird? Oder müsste ich entweder einen Zeiger übergeben zu return Vektor als Eingabe für die Funktion.
Alex
Nun habe ich wieder einen ganzen Vektor, nicht ein Zeiger darauf.
Ich nehme an du dein problem gelöst - aber es ist nur möglich zu spekulieren, ohne zu sehen, den tatsächlichen code. Btw, ein Verweis ist kein Zeiger.
InformationsquelleAutor Alex | 2011-02-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erstellen, die alles auf den heap mit
new
. Sollten Sie nicht geben sich von der Funktion der Verweise auf stack-Objekte, Sie werden zerstört, sobald die Funktion beendet ist.Wenn Sie es bevorzugen, Ihre Funktion geben Sie die Vektor - von Wert, werden Sie sicher, dass die Objekte, die in den Vektor implementieren, copy-Konstruktor (und vielleicht Zuweisungsoperator auch nicht sicher). Mit,, bitte vergessen Sie nicht, über die Regel der Drei.
Nein, Sie müssen
std::vector<int>* pResult = new std::vector<int>();
. Und Sie müssten, um Zugang zu Ihren Vektor-alspResult->push_back(...)
stattresult.push_back(...)
.Das ist, was ich Frage mich, ob es einen anderen Weg, es zu tun, nicht nur Zeiger. Obwohl ich denke, es sollte Zeiger sowieso, weil es besser für den Speicherverbrauch.
ein anderer Weg wäre, dass Sie die Funktion bekommt, die den Vektor als argument (Zeiger oder Referenz), und füllt diese mit dem Inhalt. Auf diese Weise könnte tatsächlich besser aus dem Ressourcen-management-Sicht: Sie brauchen nicht zu kümmern, die die Freilassung des Vektors auf heap.
InformationsquelleAutor Vlad
C++11 sollte Ihr problem lösen mit rvalue-Referenzen. Ehrlich gesagt, habe ich noch nicht selber ausprobiert, aber von was ich habe gelesen es wird genau das tun, was Sie versuchen zu tun ist, schicken Sie die Vektor-ohne Sie zu zerstören und neu zu erstellen (durch die übergabe des Arbeitsspeichers durch, dass die vector auf neuen vector anstatt den neuen Vektor erstellen Sie Ihre eigenen Speicher und kopieren Sie den Inhalt aus dem alten).
InformationsquelleAutor Sarmad
C++ - Vektoren sind dem heap zugeordnet. Wenn Sie wieder ein Vektor durch den Wert wird ein neuer erstellt werden, mit Kopien aller Elemente, dann die ursprünglichen Elemente zerstört werden.
Es klingt wie Sie haven ' T festgelegt, daß Ihre copy-Konstruktoren richtig. Zum Beispiel:
Müssen Sie entweder löschen Sie die Kopie und Zuweisung Konstruktoren (die dann wiederum diese in eine Kompilierungs-Fehlermeldung statt der Laufzeit), oder implementieren Sie Sie richtig.
InformationsquelleAutor Timmmm