推送到成员向量时的段错误

Posted

技术标签:

【中文标题】推送到成员向量时的段错误【英文标题】:Segfault when pushing to member vector 【发布时间】:2012-06-10 05:04:23 【问题描述】:

这是一个相对较小但存在分段错误的项目。我已经搜索了很多类似的帖子,虽然很多帖子似乎有同样的问题,但没有一个能解决我的问题。

基本问题是:我有一个带有成员向量的对象 (myGraph) 和一些方法。另一个类中的方法调用myGraph 的方法之一,该方法又调用另一个方法。在 that 函数内部,对myGraph 中的整数向量进行推送。但是,此推送会导致段错误。

在某种程度上,我一直在注释掉大部分代码(当然是在一个新的分支上),并将我的代码减少到很少的几项。 (other posts 似乎表明这种事情可能是由其他地方的错误代码引起的)但我仍然遇到段错误。

接下来是淡化的文件,由少数未注释的内容组成。我说“淡化”是因为许多声明(现在为空的函数等)已被删除。如果您需要更多信息(例如,如果重要 - 不知何故 - 我在某处使用虚函数......作为一个激进的例子)请告诉我。

在 Dispatcher.h 中:

class myGraph;

class CDispatcher

public:
    CDispatcher(void);
    ~CDispatcher(void);

    void ProcessCall(string buf);

    myGraph* mymap;

;

在 Dispatcher.cpp 中:

void CDispatcher::ProcessCall(string buf) 

    mymap->getDistance(0,1);
;

在 mygraph.cpp 中:

int myGraph::getDistance(int start, int end) 
    Dijkstras(start,end);

    // This is just to return something
    return 5;
;

vector<int> myGraph::Dijkstras(int startVert,int endVert) 

    vertices_i.push_back(2); // This line results in a segfault
    cout << "push successful" << endl;

    // This is just to return something
    vector<int> unvisited;
    return unvisited;
;

mygraph.h:

typedef struct edge

    int endVert;
    int weight;
 edge;


typedef struct vertex

    long dist;
    bool visited;
    int prev;

    vector<edge> edges;
 vertex;
class myGraph

public:
    myGraph(int initSize);
    ~myGraph(void);

    int getDistance(int start, int end);
    vector<int> Dijkstras(int startVert,int endVert);

    //vector<vertex> vertices; // The original vector that was segfaulting
    vector<int> vertices_i; // Simpler vector, of just ints. Still segfaults

;

【问题讨论】:

请出示CDispatcher(void);的代码 这是一个空的构造函数。我需要什么吗? 是的,你这样做了 :):):) 请参阅下面欧内斯特的回答... 是的,你在现场 :) 非常感谢! 【参考方案1】:

不可避免的结论是成员指针myGraph* mymap指向垃圾;您显然忽略了将其初始化为指向 myGraph 对象。您需要为其创建一个对象,以便在 CDispatcher 构造函数中引用它——即,

CDispatcher(void) : mymap(new myGraph(1)) 

【讨论】:

啊,有道理。添加了这个,返回一个错误并添加了一个 int (myGraph 期望它的构造函数中有一个,我正要 ragequit 哈哈),它就像一个魅力。谢谢! 现在请原谅我复习第一章第一节的指针:“指针不是对象”。 -.-' 不敢相信我花了这么长时间并消除了这么多代码,但仍然没有弄清楚。 :(

以上是关于推送到成员向量时的段错误的主要内容,如果未能解决你的问题,请参考以下文章

带有向量向量的段错误

调用 glDrawElements 时的段错误

c++ 类向量中的段错误

使用 CUDA 流时的段错误

并行测试与地理相交时的段错误

未指定 lambda 函数的返回类型时的段错误