Segfault, возникающее при использовании стирания по вектору - PullRequest
0 голосов
/ 22 мая 2019

Я пишу некоторые базовые инструменты нейронной сети для более масштабного проекта, над которым я работаю.

Сама нейронная сеть состоит из векторов различных структур, и для одной функции я хочу ее удалитьнейрон из указанного слоя.Всякий раз, когда я использую функцию, она работает правильно, пока не уберет край нейрона, который идет к нейронам, в следующий слой (слой + 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);
    }
}

1 Ответ

1 голос
/ 22 мая 2019

Ваша проверка if(t_layer != neuralNetwork.size()) всегда будет истинной, поскольку t_layer меньше neuralNetwork.size() (в противном случае доступ предыдущей строки к neuralNetwork[t_layer] приведет к неопределенному поведению).

Вы, вероятно, хотели проверить

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