2011-10-04 132 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