在矢量上使用擦除时发生段错误

Segfault occurring when using erase on a vector

我正在为我正在进行的大型项目编写一些基本的神经网络工具。

神经网络本身由不同结构的向量组成,对于一个函数,我希望它从指定层删除一个神经元。每当我使用该函数时,它都能正常工作,直到它移除神经元的边缘,神经元的边缘进入导致段错误的下一层(层+1)的神经元。

void NeuralNetwork::deleteNeuron(int t_layer, int t_neuronToDelete){
  if(t_layer < 0 || t_layer >= neuralNetwork.size())
    throw LayerDoesNotExistException();

  int numOfNeurons = neuralNetwork[t_layer].neurons.size();
  if(t_neuronToDelete < 0 || t_neuronToDelete >= numOfNeurons)
    throw NeuronDoesNotExistException();
  //delete neuron

//removes neuron
neuralNetwork[t_layer].neurons.erase(neuralNetwork[t_layer].neurons.begin() + t_neuronToDelete);

//remove its edge from neurons to the right
  if(t_layer != neuralNetwork.size())//doesnt let it remove edges if its the output layer
    for(int i=0; i < neuralNetwork[t_layer+1].neurons.size(); i++){
      std::vector<double*>::iterator it = neuralNetwork[t_layer+1].neurons[i].pWeights.begin() + t_neuronToDelete;

      //this line segfaults
      neuralNetwork[t_layer+1].neurons[i].pWeights.erase(it);
    }
}

您的 if(t_layer != neuralNetwork.size()) 检查将始终为真,因为 t_layer 小于 neuralNetwork.size()(如果不是,则前一行对 neuralNetwork[t_layer] 的访问将导致在未定义的行为中)。

您可能打算检查

if (t_layer + 1 != neuralNetwork.size())