访问向量类成员时出现分段错误

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

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

添加向量时出现分段错误。 (C++)

分段错误:在 C++ 中弹出向量时出现 11

在 C++ 中使用向量时出现分段错误

对检索到的向量进行操作时出现分段错误

在 C++ 中比较来自向量的字符串时出现分段错误

在向量中搜索时出现分段错误