Frage an c++, stdvector, vector, declaration, stl – Vektorinitialisierung in C ++

1

Ich verwende Vektoren in meinem Code.

Die Zeile, die den Fehler verursacht, lautet wie folgt:

<code>vector<Node> alt_seq ;
alt_seq = vector<Node>(1000);
for(int j=0; j<alt_cf.getNoOfNodes(i); j++)
{
    Node temp_node = *alt_itr;
    alt_itr++;
    alt_seq.push_back(temp_node);
    }
</code>

Die Linie :

<code> alt_seq.push_back(temp_node);
</code>

verursacht einen Laufzeitfehler. Wenn ich den Vektor jedoch wie folgt mit einer Anfangsgröße initialisiere:

<code>vector<Node> alt_seq(1000) ;
</code>

In diesem Fall funktioniert der Code einwandfrei. Ich möchte jedoch keine Anfangsgröße angeben, da die Anzahl der Objekte im Vektor zur Laufzeit variabel sein wird. Bitte hilf mir. Ich bin neu in C ++.

Zu Ihrer Information finden Sie hier die vollständige Methodenfunktion:

http://pastebin.com/2dUFEui5

Übrigens hat der Pastebin-Link nicht die Definition für die KlasseNode entweder. dirkgently
@dirkgently Link zu node.h und node.cpppastebin.com/zDbJikK7 Abhinav Arora
Bearbeiten Sie Ihre Frage so, dass sie den erforderlichen Code enthält. Geben Sie uns keine Links zu Pastebin, die möglicherweise zu rot führen Sam Miller
Sieht aus wie ein Problem mit der KlasseNode's Big-Three-Implementierungen. Können Sie uns die Definition vonNode? dirkgently

Deine Antwort

2   die antwort
3

IhreNode Klasse hat einen Zeiger vom TypCombinedFragment* namenscfrag. Auf diese Weise werden baumelnde Referenzen erstellt, wenn Sie keine eigenen Kopierer- und Zuweisungsoperatoren definiert haben. Außerdem ist ein geeigneter Prüfer erforderlich, um Undichtigkeiten zu vermeidenNode ist verantwortlich für die Zuordnung / Freigabecfrag. Wenn Sie nicht tief kopieren möchtenCombinedFragment Sie können eine verwendenshared_ptr.

Auch der Standard-Ctor fürNode wahrscheinlich muss es nicht einmal da sein (es geht)cfrag in einen nicht initialisierten Zustand).

Vielen Dank, ich werde das versuchen ... Wenn Sie sich andere Klassen im Projekt ansehen möchten, finden Sie den Code bei GitHubgithub.com/abhinavarora/mbt Abhinav Arora
Wie Sie sagten, habe ich die großen drei wie folgt hinzugefügtpastebin.com/g2n14awz  Bitte lassen Sie mich wissen, ob dieser Zusatz korrekt ist. Trotz der obigen Änderungen wird immer noch ein Laufzeitfehler angezeigt. Bitte helfen Sie. Ich verstehe meinen Fehler nicht. Abhinav Arora
@AbhinavArora: Versuche die richtigen großen Drei hinzuzufügen und komme zurück, wenn das dein Problem nicht löst! dirkgently
this->cfrag = frag; Sieht verdächtig aus. Beim Kopieren machen Sie ein paar Zeiger, die auf dasselbe zeigenCombinedFragment Objekt. Wenn nun einer von ihnen gelöscht wird, wird der andere zu einem baumelnden Zeiger. Jeder Zugriff daraufcfrag Objekt ist UB. Verwenden Sie also anstelle eines rohen Zeigers einenshared_ptr<CombinedFragment> als Mitglied, so dass auch nach dem Löschen einesNode Objekt, das Sie nicht verlierenCombinedFragment Objekt, mit dem andere lebenNode Objekte. HTH. dirkgently
0

Ich kann ein Problem sehen; wenn Sie 1000 deklarierenvector Objekte und dann tun apush_back Sie fügen am Ende des Vektors hinzu, d. h. die Objekte, die Sie hinzufügen möchten, befinden sich bei 1001, 1002 ... usw. Wenn Sie 1000 deklarierenvector objects gibt dir keinen Laufzeitfehler, ich würde zuerst sehen, was die Standarddefinition ist (da die ersten 1000 Node-Objekte Standardwerte haben), da dies kein Fehler ist und mit den tatsächlichen Daten verglichen wird, die ich zu laden versuche. Hoffe das hilft.

Verwandte Fragen