在矢量上使用擦除时发生段错误
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())
我正在为我正在进行的大型项目编写一些基本的神经网络工具。
神经网络本身由不同结构的向量组成,对于一个函数,我希望它从指定层删除一个神经元。每当我使用该函数时,它都能正常工作,直到它移除神经元的边缘,神经元的边缘进入导致段错误的下一层(层+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())