2016-07-27 45 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)

相关问题