2016-03-24 3 views
1

Ich habe Probleme mit dem Speichern von Zeigern zu Adressen für Stack zugeordneten Objekten in Vektoren. Irgendwie scheinen die Zeiger einander auf eine Weise zu überschreiben, die ich nicht verstehe.Speichern der Adresse zu Stack zugeordneten Objekt in Vektor

In meiner Hauptsache möchte ich aus einer Datei lesen, Knoten (Stapel zugeordnet) erstellen und sie in einen Vektor einfügen. Später lese ich weiter aus der Datei, um Verbindungen (Edges) zwischen den Knoten zu erstellen und staple somit Edge-Objekte zu und versuche, die Adressen zu diesen im jeweiligen Knoten zu speichern (Knoten enthalten einen Vektor). Die Eingabedatei hat das Format index_1 a, index_2, b, Kapazität c, was bedeutet, dass eine Kante von a nach b und umgekehrt mit der Kapazität c erstellt werden soll.

Jedes Mal, wenn ich einem Knoten eine Kante (vector :: push_back()) hinzufüge, wird der gesamte Vektor im Knoten auf den gleichen Zeiger gesetzt (anstatt nur einen anderen Zeiger wie vorgesehen anzuhängen). Beispiel Ausgabe nach der Zugabe von 3 Kanten zum gleichen Knoten:

#0 named: ORIGINS connected to: 
#1 named: 2, capacity: -1, flow: 0 

#0 named: ORIGINS connected to: 
#17 named: 3W, capacity: -1, flow: 0 
#17 named: 3W, capacity: -1, flow: 0 

#0 named: ORIGINS connected to: 
#16 named: 3E, capacity: -1, flow: 0 
#16 named: 3E, capacity: -1, flow: 0 
#16 named: 3E, capacity: -1, flow: 0 

Excuse meines Code, wenn es irgendwelche Tests oder Druck in ihm links:

Main:

Edge.cpp:

#include "Edge.h" 

Edge::Edge() : endNode(nullptr), capacity(0), flow(0) {}; 
Edge::Edge(Node* n, int c, int f) : endNode(n), capacity(c), flow(f) {}; 
Edge::Edge(const Edge& other) { 
    endNode = other.endNode; 
    capacity = other.capacity; 
    flow = other.flow; 
}; 

bool Edge::pushFlow(int f) { 
    if (flow + f <= capacity) { 
     flow += f; 
     return true; 
    } else { 
     return false; 
    } 
} 

bool Edge::popFlow(int f) { 
    if (flow - f >= 0) { 
     flow -= f; 
     return true; 
    } else { 
     return false; 
    } 
} 

Node* Edge::getEndNode() { 
    return endNode; 
} 

int Edge::getCapacity() { 
    return capacity; 
} 

int Edge::getFlow() { 
    return flow; 
} 

Node.cpp:

#include "Node.h" 
#include <iostream> 
Node::Node() : name(""), index(-1) {}; 
Node::Node(std::string n, int i) : name(n), index(i) {}; 
Node::Node(const Node& other) : name(other.name), index(other.index), edges(other.edges) {}; 

void Node::addEdge(Edge* e) { 
    edges.push_back(e); 
} 

std::vector<Edge*> Node::getEdges() { 
    return edges; 
} 

Node& Node::operator=(const Node& rhs) { 
    if (this == &rhs) return *this; 
    name = rhs.name; 
    index = rhs.index; 
    edges = rhs.edges; 
    return *this; 
} 

std::string Node::getName() { 
    return name; 
} 

int Node::getIndex() { 
    return index; 
} 

Vielen Dank für jede Hilfe oder Zeiger (er he)!

+0

Stapel zugewiesene Instanzen werden zerstört, sobald sie den Gültigkeitsbereich verlassen, daher ist es sicherlich keine gute Idee, ihre Adressen weiter außerhalb dieses Bereichs zu verwenden. –

+0

Bei zukünftigen Fragen reduzieren Sie bitte Ihren Code auf ein ** minimales, aber vollständiges Beispiel **, das Leser ausprobieren können. –

+1

Angenommen, der Sportwagen Ihrer Träume ist in 1428, Elm Street geparkt. Am nächsten Tag triffst du einen guten Freund und du sagst "Geh zu 1428, Elm Street und sieh dir mein Traumauto an". Er kommt zurück und sagt: "Warum träumst du von einem Müllwagen? Du brauchst Hilfe". Verstehst du, wie das passieren könnte? – molbdnilo

Antwort

3

Sobald die Ausführung den Bereich verlässt, in dem eine nicht static Variable deklariert ist, ist diese Variable nicht mehr vorhanden und die Zeiger darauf werden dangling pointer.

Ein Dangling-Zeiger ist ungültig. Auch wenn Sie nur den Wert prüfen, kann dies zu einem Hardware-Trap führen. Daher ist jede Verwendung von Undefined Behavior.

Und so ist das, was du hast, weil du Dinge wie

graph[a].addEdge(&e1); 

in einer Schleife zu tun, wo e1 eine Variable in der Schleife deklariert ist.

+0

Ich sehe. Also musst du alles aufteilen? – Pkaff

+0

@Pkaff, die eine Kopie Ihres Knotens schiebt, so dass es in Ordnung ist. – Simple

+0

@Pkaff Ändern Sie Ihren Vektor, um Edge nicht Zeiger auf Edge zu halten. Wenn Zeiger erforderlich sind, müssen Sie sie dynamisch zuordnen. – zoska

Verwandte Themen