出于某种原因,我遇到了分段错误;我正在使用一个指针向量,它指向一个类对象。基本上我需要一个节点,它有一个指向其他节点的指针向量,另一个节点用于制作多图。这是我的代码的相关部分:
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工作正常。但是当我访问向量的内容时,它只会崩溃并给出分段错误错误。谁知道为什么?
答案 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
会更容易,因为你可以复制指针,它们仍然会指向同一个对象。