C++ C++;内存错误
当我编译代码时,我反复得到错误C++ C++;内存错误,c++,memory,reference,C++,Memory,Reference,当我编译代码时,我反复得到错误 free(): invalid next size (fast) 然而,代码仅限于创建引用。具体地说,注释掉一行似乎可以修复错误;然而,这是一条非常重要的路线 void neuron::updateWeights(layer &prevLayer) { for(unsigned i = 0; i < prevLayer.size(); i++) { double oldDeltaWeight = prevLayer[i].m
free(): invalid next size (fast)
然而,代码仅限于创建引用。具体地说,注释掉一行似乎可以修复错误;然而,这是一条非常重要的路线
void neuron::updateWeights(layer &prevLayer) {
for(unsigned i = 0; i < prevLayer.size(); i++) {
double oldDeltaWeight = prevLayer[i].m_connections[m_index].m_deltaWeight;
double newDeltaWeight = eta * prevLayer[i].m_output * m_gradient + alpha * oldDeltaWeight;
prevLayer[i].m_connections[m_index].m_deltaWeight = newDeltaWeight; // THIS LINE
prevLayer[i].m_connections[m_index].m_weight += newDeltaWeight;
}
}
void neuron::updatewights(层和层){
for(无符号i=0;i
任何帮助都将不胜感激
编辑:
附加代码
//标题
#包括“../../include/neuralNet.h”
//库
#包括
#包括
#包括
//名称空间
使用名称空间std;
//类构造函数
神经元::神经元(无符号索引,无符号输出){
m_指数=指数;
for(无符号i=0;i1
}
//传递函数求导法
双神经元::传递函数导数(双x)常数{
返回1-x*x;//tanh的导数
}
//设定输出值
无效神经元::设置输出(双值){
m_输出=值;
}
//向前传播
void neuron::重新计算(层和上一层){
双和=0.0;
for(无符号i=0;i
这里也叫这条线
// Update weights
for(unsigned layerIndex = m_layers.size() - 1; layerIndex > 0; layerIndex--) {
layer ¤tLayer = m_layers[layerIndex];
layer &previousLayer = m_layers[layerIndex - 1];
for(unsigned i = 1; i < currentLayer.size(); i++) {
currentLayer[i].updateWeights(previousLayer);
}
}
//更新权重
对于(unsigned layerIndex=m_layers.size()-1;layerIndex>0;layerIndex--){
图层¤tLayer=m_图层[layerIndex];
图层&previousLayer=m_图层[layerIndex-1];
for(无符号i=1;i
您的构造函数初始化类中的N个“输出”m_连接
但是你有很多地方叫:
m_connections[m_index]
如果m_index>输出会发生什么?这在你的问题中可能吗?
尝试在构造函数的第一行中包含assert():
assert(index < outputs)
assert(索引<输出)
您可能在某个地方的指针访问不正确。请详细说明您的问题。目前还不清楚你是如何解决这个问题的,因此我们无法帮助你。您可能希望阅读一些好的问题,以便更好地了解我们在堆栈溢出上希望看到的问题类型。此外,你可能会发现创建一个有帮助的页面,因为你提供的例子很少,但既不完整也不可验证。希望这有帮助?自从给prevLayer[I].m_connections[m_index].m_deltaWeight分配了一个值之后,我非常迷茫。m_deltaWeight会抛出一个错误,但从中检索一个值却不会。这是一个运行时错误(从C库中),而不是编译错误。而且你发布的代码不是一个错误。@Brian具体地说,注释掉一个特定的行似乎可以修复错误——给定这一行,错误不是“修复的”,只是被掩盖了,因为你很可能已经损坏了内存。您所做的只是将错误从代码的一部分移动到代码的另一部分。我建议您保留该行,并实际修复错误。@Brian
m\u connections[m\u index]
--将所有这些更改为m\u connections.at(m\u index)
--如果您现在抛出std::out\u of\u range
异常,请不要感到惊讶。
assert(index < outputs)