2016-03-24 3 views
1

ベクトルにスタック割り当てオブジェクトのアドレスへのポインタを格納するのに問題があります。どういうわけか、ポインタは私が理解しない方法でお互いを上書きするように見えます。割り当てられたオブジェクトをベクトルにスタックするためのアドレスを格納する

私の主張では、ファイルから読み込み、ノード(割り当てられたスタック)を作成してベクトルに配置します。後でノードからノードへの接続(エッジ)を作成するためにファイルから読み込み、スタックにEdgeオブジェクトを割り当て、それぞれのノード(ノードにはベクターが含まれています)にこれらのアドレスを格納しようとします。入力ファイルの形式は、index_1 a、index_2、b、容量cです。これは、aからbへのEdgeとその逆が作成され、容量cであることを意味します。

EdgeにNode(vector :: push_back())を追加するたびに、ノード内のベクトル全体が(別のポインタを意図的に追加するのではなく)同じポインタに設定されます。それに残ってテストやプリントが存在する場合

#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 

言い訳私のコード:同じノードに3つのエッジを追加した後の出力例

メイン:

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; 
} 

ご協力ありがとうございました。

+0

スタック割り当てインスタンスは、スコープ外に出るとすぐに破棄されるため、そのスコープの外側でさらにアドレスを使用することは非常に良い考えではありません。 –

+0

今後の質問では、コードを、読者が試してみることができる**最小限の完全な例**に減らしてください。 –

+1

あなたの夢のスポーツカーが1428、Elm Streetに駐車されているとします。翌日、あなたはいい友達に会い、「1428、エルムストリートに行き、私の夢の車を見る」と言う。彼は帰ってきて「なぜあなたはゴミトラックを夢見るのですか?助けが必要です」と言います。それがどうやって起こるのか理解していますか? – molbdnilo

答えて

3

実行がスコープを離れるとすぐに、変数が宣言され、その変数は存在しなくなり、そのポインタはダングリングポインタになります。

ダングリングポインタがで、無効です。値を調べるだけでも、ハードウェアトラップが発生する可能性があります。したがって、その使用は未定義の動作です。

そして、あなたはe1は、ループ本体で宣言された変数であるループに

graph[a].addEdge(&e1); 

のようなものを行うため、そのためには、あなたが持っているものです。

+0

私は参照してください。だから、すべてを割り当てる必要がありますか? – Pkaff

+0

@Pkaffこれは、あなたのノードのコピーをプッシュするので、問題ありません。 – Simple

+0

@Pkaff EdgeをEdgeにポインタしないようにベクトルを変更します。ポインタが必要な場合は、ポインタを動的に割り当てる必要があります。 – zoska

関連する問題