2016-07-27 71 views
-1

當我使用valgrind運行我的程序時,它給出了大小爲8的錯誤的無效讀取和寫入。我已經打破了我的頭,但我看不出有什麼問題。使用Valgrind無效讀取大小爲8的數據

的Valgrind的錯誤發生在這個代碼的最後和倒數第二行:

void MLPerceptron::returnOutputActivation(vector<Feature> imageFeatures,vector<double>& outputActivation){ 
    int train = 1; 
    for (unsigned int i = 0; i<imageFeatures.size();i++){ 
     activations[0] = imageFeatures[i].content; 
     feedforward(train); 
     activationsToOutputProbabilities(); 
     setMinActivation(outputActivation,activations[2]); 
    } 
} 

void MLPerceptron::setMinActivation(vector<double>& minOutputActivation,vector<double> currentActivation){ 

    for(unsigned int i=0;i<currentActivation.size();i++){ 
      if(minOutputActivation[i] > currentActivation[i]) 
        minOutputActivation[i] = currentActivation[i]; 
    } 
} 

的載體在另一個函數初始化,然後提供給功能returnOutputActivations,這種情況發生在不同的文件在這裏看到:

void MLPController:: createOutputProbabilitiesVectorTest(vector<vector<Feature> >& testSet){ 
    unsigned int nOutputProbabilities = settings.mlpSettings.nOutputUnits; 

    vector<double> input; 
    input.reserve(nOutputProbabilities*nMLPs); 

    for(int j=0; j<nMLPs; j++){ 
     vector<Feature>::const_iterator first = testSet[j].begin(); 
     vector<Feature>::const_iterator last = testSet[j].begin()+numPatchesPerSquare[j]; 

     vector<double> inputTemp = vector<double>(nOutputProbabilities, 10.0); 

     mlps[0][j].returnOutputActivation(vector<Feature>(first,last),inputTemp); 

     input.insert(input.end(),inputTemp.begin(),inputTemp.end());  
    } 

    Feature newFeat = new Feature(input); 
    newFeat.setLabelId(testSet[0][0].getLabelId()); 
    inputTrainSecondLayerMLP.push_back(newFeat); 
} 

我知道已經有很多關於valgrind錯誤的帖子,但它並沒有幫助我弄清楚發生了什麼問題。

+2

請發佈一個[最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve)來請求我們幫助調試。 – MikeCAT

+0

'imageFeatures.size());''由於額外的'''會發出編譯錯誤。 – MikeCAT

+0

'功能newFeat =新功能(輸入);'這可能是有效的,但氣味。爲什麼不'Feature newFeat(input);'Feature * newFeat = new Feature(input);'? – MikeCAT

回答

0

我認爲 Feature newFeat = new Feature(input) 是問題所在。這將在堆上分配一個新功能,但您將失去其地址,因此不會被刪除。根據MikeCAT的建議使用Feature* newFeat = new Feature(input)

相關問題