2011-10-04 96 views
2

我有一个指向我通过使用std :: vector :: iterator`遍历的对象的向量。由于返回的元素本身就是一个指针,我将迭代器两次解引用,一次返回指针,一次解析指向实际对象的指针。尝试从指针向量中取消引用指针的分段错误

我想调用一个返回std :: string的成员函数(getClass),我试过(**it).getClass()(*it)->getClass()但都给我一个分段错误。我一直觉得我失去了一些明显的东西。

部分功能的代码:

void dataSet::createFolds() 
{ 
    // Shuffle the data vector 
    std::random_shuffle(m_records.begin(), m_records.end()); 

    std::cout << "STARTING MAIN LOOP. THERE ARE " << m_records.size() << " RECORDS\n"; 
    // iterate through the data vector and assign each to a fold 
    std::vector<dataRecord *>::iterator it = m_records.begin(); 
    while (it != m_records.end()) 
    { 
     std::string currentClass = (*it)->getClass(); // SEG FAULT HERE 
     . 
     . 
     . 
    } 
    . 
    . 
    . 
} 

的载体是m_records ... code

dataRecord被这样定义... code

在回答关于填充向量的问题:

数据从文本文件中读取,我真的不想发布整个事情,除非我必须(212行),但填充矢量的相关代码如下。 dataRecord对象的构造函数接受一个field对象的向量。我使用临时指针,使用new来创建对象,然后push_back指针。

while ... 
{ 
    std::vector<field> fields; 

    // build the fields vector 
    for (unsigned int i = 0; i < numAttribs; ++i) 
     fields.push_back(field(data.at(i), attribTypes[i])); 

    // create the new dataRecord 
    dataRecord * newRecord = new dataRecord(fields); 

    // add the record to the set 
    m_records.push_back(newRecord); 

    ++recordNum; 
    std::cout << "read record " << recordNum << std::endl; 
} 
+1

看起来像这个错误与你如何填充矢量有关。发布相关代码,我们可以看看。 –

+0

你的定义很好,但我想问题在于别的地方。也许在你填写矢量的时候?你是否100%肯定你不向该向量中插入任何NULL值? – Constantinius

+0

你的一个或多个指针可能是悬空的,即指向被破坏的东西? –

回答

0

在我看来矢量元素被严重初始化。也许你必须在测试之前测试独立填充矢量的代码来提取它们。对不起,我的英语;)

0

容器中的指针为空,或者它们悬挂着指向free'd内存的指针。

仔细检查填充m_records的代码。

0

std::string dataRecord::getClass() {return m_data.at(m_data.size() - 1).getTextData();} 

您必须验证m_data.size(),因为可能是0,所以你会离开或范围的例外。

+0

发布填充'm_records'的代码 –

+0

对不起,我刚刚看到它 –

0
// create the new dataRecord 
    dataRecord * newRecord = new dataRecord(fields); 

我猜这个bug是在dataRecord的构造函数中。你确定这是做得好吗?

+0

字段是字段对象的向量而不是另一个dataRecord,因此它不是复制构造函数。 – Matt

+0

@Matt是的,我的坏。编辑... – jrok