访问向量类成员时出现分段错误
Posted
技术标签:
【中文标题】访问向量类成员时出现分段错误【英文标题】:Segmentation fault on accessing vector class member 【发布时间】:2017-03-17 17:34:24 【问题描述】:我在 C++ 中的这一行出现分段错误:
vector<TemplateElement*> children = getChildren();
类That
继承自抽象类TemplateElement
如何解决?
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <vector>
#include "strings.h"
#include "aimlthat.h"
using namespace std;
using namespace aiml;
vector<string> That::elements()
vector<TemplateElement*> children = getChildren();
vector<string> elements;
for (int i = 0, n = children.size(); i < n; i++)
string text = children[i]->toString();
text = trim(text);
vector<string> vsText = split(text);
for(int j=0, m=vsText.size(); j<m; ++j)
elements.push_back(vsText[j]);
return elements;
/**************************************************** ******************************/
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <vector>
#include <map>
#include "strings.h"
#include "aimltemplateelement.h"
#include "aimltext.h"
using namespace std;
using namespace aiml;
vector<TemplateElement*> TemplateElement::getChildren()
return m_vtChildren;
/**************************************************** *****************************/
#ifndef __AIMLTEMPLATEELEMENT_H__
#define __AIMLTEMPLATEELEMENT_H__
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <vector>
#include <map>
#include "strings.h"
#include "aimlelement.h"
using namespace std;
using namespace aiml;
namespace aiml
class TemplateElement : public AIMLElement
public:
TemplateElement()
TemplateElement(vector<TemplateElement*> elements);
vector<TemplateElement*> getChildren();
virtual string toString() = 0;
private:
vector<TemplateElement*> m_vtChildren;
;
#endif
/**************************************************** *************************/
这是That
的课程:
#ifndef __AIMLTHAT_H__
#define __AIMLTHAT_H__
#include <iostream>
#include <ctime>
#include <cstdlib>
#include "aimltemplateelement.h"
using namespace std;
namespace aiml
class That : public TemplateElement
public:
That()
vector<string> elements();
private:
;
#endif
【问题讨论】:
听起来你可能需要学习如何使用调试器来单步调试你的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。延伸阅读:How to debug small programs 我很好奇,你如何填充m_vtChildren
向量?您能否举例说明如何在您的main
中使用它?
@Rama 这是错误:ideone.com/CyJVtB,我添加了指向That that;
的指针。为什么它不起作用?
@simslay 编辑了我的答案,您也需要初始化That * that;
! ideone.com/0uMWHk
【参考方案1】:
你需要检查空指针:
for (int i = 0, n = children.size(); i < n; i++)
if(children[i]) //Be sure that children[i] is not null before dereferencing it
string text = children[i]->toString();
text = trim(text);
vector<string> vsText = split(text);
for(int j=0, m=vsText.size(); j<m; ++j)
elements.push_back(vsText[j]);
[编辑]
从您的评论中,我看到您所需要的只是在使用它之前初始化指向That
的指针,顺便说一句,完成后不要忘记删除它:
That* that = new That();
that->elements();
【讨论】:
分段错误发生在这一行之前:vector children = getChildren(); @simslay 那么你很可能使用了无效的That
。
@simslay 所以请发布你的课程That
以上是关于访问向量类成员时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章