C++ 动态二维阵列丢失二维

C++ 动态二维阵列丢失二维,c++,multidimensional-array,C++,Multidimensional Array,我有一个动态分配的2D数组,它被填充在一对for循环中。由于某种原因,在For循环结束时,所有元素都在不可访问的内存中 /*************Start Positive Phase*************************/ double *posHidActivations = new double[FEATURES]; memset(posHidActivations, 0, sizeof(double)*FEATURES); double *posVisActivatio

我有一个动态分配的2D数组,它被填充在一对for循环中。由于某种原因,在For循环结束时,所有元素都在不可访问的内存中

/*************Start Positive Phase*************************/
double *posHidActivations = new double[FEATURES];
memset(posHidActivations, 0, sizeof(double)*FEATURES);

double *posVisActivations = new double[m_NumRatings];
memset(posVisActivations, 0, sizeof(double)*m_NumRatings);


double **posProducts = new double*[FEATURES];
for(int i=0; i<FEATURES; i++)
   posProducts[i] = new double[m_NumRatings];
for(int i=0; i<FEATURES; i++)
   for(int j=0; j<m_NumRatings; j++)
      posProducts[i][j] = 0;
/* manually verified elements are valid and 
   initialized to 0 with gdb */

// for each hidden node
for(int j=0; j<FEATURES; j++)
{   
   // sum up inputs from the visible layer
   for(int i=0; i<m_NumRatings; i++)
   {   
      double input = m_VisLayer[i]*m_Weights[i][j];
      double prob = sigmoid(input, m_HidItemBias[j]);
      posProducts[j][i] = m_VisLayer[i]*prob;
      posVisActivations[j]+=m_VisLayer[i];   // commenting out this line fixes
      posHidActivations[j]+=prob;
   }   
   // posProducts[i][0] is valid here
}  
/* posProducts[0][0] is a segfault 
   using gdp verified that posProducts is a valid double**
   and posProducts[0] is a valid double*
/**********启动正相位*************************/
double*posHidActivations=新的double[功能];
memset(posHidActivations,0,sizeof(double)*特性);
double*posVisActivations=新的double[m_NumRatings];
memset(posVisActivations,0,sizeof(double)*m_数值);
双**posProducts=新双*[功能];
对于(int i=0;i,如您所述:

posVisActivations[j]+=m_VisLayer[i];   // commenting out this line fixes
posVisActivations的索引是j,范围从0到m_特征,但posVisActivations被声明为具有m_numRatings元素的数组

因此,您正在写入超过数组末尾的内容。您可能打算使用
i
作为索引:

posVisActivations[i]+=m_VisLayer[i];   // commenting out this line fixes
HTH.

正如您所注意到的:

posVisActivations[j]+=m_VisLayer[i];   // commenting out this line fixes
posVisActivations的索引是j,范围从0到m_特征,但posVisActivations被声明为具有m_numRatings元素的数组

因此,您正在写入超过数组末尾的内容。您可能打算使用
i
作为索引:

posVisActivations[i]+=m_VisLayer[i];   // commenting out this line fixes

HTH.

您是否考虑过将
double**
替换为
vector
?posProducts和posProducts[0]在出现故障时是否指向同一位置(例如,在分配内存后立即验证时)?我想到了这个问题。我之所以没有想到这个问题,是因为程序中已经有足够的代码,返回并用向量替换数组将非常耗时。如果我不能很快找出这个错误,我想我还是会去做的。据我所知,这与你的问题无关,但我真的发现它令人困惑ng首先将
i
作为外部迭代变量,将
j
作为内部迭代变量,之后,它们的角色会颠倒。如果保持一致,通常会有助于可读性。@n0rd是的。两个级别的指针指向相同的精确地址。最后的1D数组似乎不存在ar.您是否考虑过将
double**
替换为
vector
?posProducts和posProducts[0]在出现故障时是否指向相同的位置(例如,在分配内存后立即进行验证时)?我想到了这个问题。我之所以没有想到这个问题,是因为程序中已经有足够的代码,返回并用向量替换数组将非常耗时。如果我不能很快找出这个错误,我想我还是会去做的。据我所知,这与你的问题无关,但我真的发现它令人困惑ng首先将
i
作为外部迭代变量,将
j
作为内部迭代变量,之后,它们的角色会颠倒。如果保持一致,通常会有助于可读性。@n0rd是的。两个级别的指针指向相同的精确地址。最后的1D数组似乎不存在ar.有时我会惊讶于我怎么能盯着一段代码看这么久,却错过了这么明显的东西。另外,我奇怪索引的部分原因是,任何“Vis”的东西都应该用“I”来索引,任何“Hid”的东西都应该用“j”来索引。但我仍然错过了它!有时我会惊讶于我怎么能盯着一段代码看这么久,却错过了这么明显的东西s、 另外,我奇怪的索引的部分原因是,任何“Vis”都应该用“i”来索引,任何“Hid”都应该用“j”来索引。但我仍然怀念它!