初始化指向指针的C ++错误

时间:2019-04-12 03:41:01

标签: c++ arrays pointers dynamic heap

我使用的是大型代码库,因此请原谅我未包含所有源代码。我将尽力总结这个问题,并希望它足以给我一些直觉来回答。

在创建指向指针的指针(用作动态指针数组)时,我在堆中某处出现错误,请参见下图获取调用堆栈:

Error

所有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()错误。

1 个答案:

答案 0 :(得分:1)

正如Igor Tandetnik所评论的,这种错误很可能是由于size的垃圾值,或者是由于堆已损坏。确保size是一个有效的数字,并确保您不写不应该触摸的内存(因为这可能会损坏堆)。

如果可能,可以使用代码清理程序(例如clang)进行检查,或者可以使用类似valgrind的工具查看它何时发生。