在载体中访问指针的成员函数时分段故障(Segmentation fault when accessi

2019-09-28 03:05发布

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

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]的字符串为‘G’和指向其它2个节点,所以第2个COUTS完美工作。 但是,当我访问向量的内容,它只是崩溃,并给出一个分段错误。 任何人都知道为什么吗?

Answer 1:

add_arc要存储参数的地址a ,当函数退出,然后将其摧毁-让你拥有未定义的行为。

你也复制节点,当你调用nodes.push_back()这是会导致你很多痛苦。

你将需要或者停止复制或编写正确的拷贝构造函数(然后按照3的规则,或5)。



Answer 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中的节点的向量(未指针节点)



Answer 3:

如果你vector.push_back(一),向量中的节点是复制(存储在不同的存储ADRESS)。 Moreoever您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 ,因为你可以复制三分球,他们仍将指向同一个对象。



文章来源: Segmentation fault when accessing a pointer's member function in a vector