我使用的是大型代码库,因此请原谅我未包含所有源代码。我将尽力总结这个问题,并希望它足以给我一些直觉来回答。
在创建指向指针的指针(用作动态指针数组)时,我在堆中某处出现错误,请参见下图获取调用堆栈:
所有setFrontNodes()是:
void Node::setFrontNodes(int size) {
frontNodes = new Node*[size]; // ERROR ON THIS LINE
nFrontNodes = size;
}
我的班级节点的标题为:
class Node {
public:
~Node();
int nBackNodes;
int nFrontNodes;
Node** backNodes;
Node** frontNodes;
void setFrontNodes(int size);
void setBackNodes(int size);
double value;
double valuePrime;
ActivationFunction* activationFunction = NULL;
InitWeightMethod* initWeightMethod = NULL;
void initWeights(double multiplier);
double bias;
double deltaBias;
double* weights;
double* deltaWeights;
double errorGradient;
Node(int number);
void forwardProp();
int number;
string label;
int layer;
};
现在这是一个奇怪的问题。该错误将随机发生。我将使用相同的参数和所有内容运行同一程序,并且该错误将在此发生,或者在运行时的另一个时间发生,或者根本不会发生!这使得跟踪错误非常困难,并且为什么我没有完整的代码示例可以重复。
听起来好像在堆上分配内存有些问题,尽管我不确定它可能是什么或如何修复它。向量不会引起错误,但是在训练神经网络(例如我正在使用其代码)时会感到麻木。
我运行了内存诊断程序,并且在发生错误时仍然有超过4GB的RAM。
随时感谢!让我知道您是否还有其他需要,但就像我说的那样,它是一个大程序,并且该错误似乎是随机的,因此我正在寻找在导致ntdll.dll的堆上分配内存时可能遇到的一般问题屏幕截图中的!_RtlReportCriticalFailure @ 12()错误。
答案 0 :(得分:1)
正如Igor Tandetnik所评论的,这种错误很可能是由于size
的垃圾值,或者是由于堆已损坏。确保size
是一个有效的数字,并确保您不写不应该触摸的内存(因为这可能会损坏堆)。
如果可能,可以使用代码清理程序(例如clang)进行检查,或者可以使用类似valgrind的工具查看它何时发生。