在向量

时间:2016-05-07 17:30:38

标签: c++ pointers vector

出于某种原因,我遇到了分段错误;我正在使用一个指针向量,它指向一个类对象。基本上我需要一个节点,它有一个指向其他节点的指针向量,另一个节点用于制作多图。这是我的代码的相关部分:

node.h:

#ifndef NODE_H
#define NODE_H

class node
{
public:
    string content()
    vector<node*> next;      //causing the error
    void add_arc(node a);

    string rna_frag;

#endif

node.cpp:

void node::add_arc(node a)
{
    node *b = &a;    //b->content() works fine here
    next.push_back(b);
}

string node::content()
{
    return rna_frag;
}

main.cpp中:

int main()
{
    vector<node> nodes;
    node a;
    node b;
    node c;

    a.add_arc(b);
    a.add_arc(c);
    a.rna_string = "G";

    nodes.push_back(a);
    nodes.push_back(b);
    nodes.push_back(c);

    cout << nodes[0].content() << endl;    //prints "G", works fine
    cout << nodes[0].next.size() << endl;  // prints "2", works fine
    cout << nodes[0].next[0]->content() << endl;  //segmentation fault
    //cout << nodes[0].next->content() << endl;   //also segmentation fault
    //cout << nodes[0].next[0]->rna_frag << endl; //also segmentation fault
}

在这种情况下,节点[0]的字符串是&#34; G&#34;并指向其他2个节点,因此前2个couts工作正常。但是当我访问向量的内容时,它只会崩溃并给出分段错误错误。谁知道为什么?

3 个答案:

答案 0 :(得分:5)

add_arc中,您存储参数a的地址,然后在函数退出时将其销毁 - 因此您有未定义的行为。

当您拨打nodes.push_back()时,您还会复制节点,这会让您感到非常悲伤。

您将需要停止复制或编写正确的复制构造函数(然后遵循3或5的规则)。

答案 1 :(得分:2)

使用

void node::add_arc(node a)
{
    vertex *b = &a;    //b->content() works fine here
    next.push_back(b);
}

next中添加指向从方法(a)退出的对象的指针。

使用它......

cout << nodes[0].next[0]->content() << endl;

崩溃!

建议:在节点向量中转换next(不是节点指针)

答案 2 :(得分:2)

如果你做vector.push_back(a),向量中的节点是一个副本(存储在不同的内存地址)。除此之外,你的add_arc按值获取其参数,你推入向量的节点是该函数的本地节点。一旦这样你就离开了这个函数的范围,取消引用该指针是未定义的行为。

您应该考虑通过引用传递参数,或者在这种情况下,甚至更简单地指向要添加的节点的指针。然而,那么你必须要知道在你的主要...

vector<node> nodes;
node a;
node b;

a.add_arc(b);

nodes.push_back(a);
nodes.push_back(b);

不是您想要的,因为现在a已将b添加为弧,而节点向量的第二个条目是b副本 }。也许在这种情况下使用vector<node*> nodes会更容易,因为你可以复制指针,它们仍然会指向同一个对象。