初始化指向指针的指针时出现 C++ 错误

C++ Error when Initializing a pointer to a pointer

我使用的是大code-base,所以请原谅我没有包括所有源代码。我会尽我所能总结问题,希望它足以给出一些直觉答案。

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

所有 setFrontNodes() 是:

void Node::setFrontNodes(int size) {
    frontNodes = new Node*[size]; // ERROR ON THIS LINE
    nFrontNodes = size;
}

我的 class 节点的 header 是:

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;
};

现在是 st运行ge 问题。该错误将 运行 经常发生。我将 运行 具有相同参数和所有内容的相同程序,错误将在那里发生,或者在 运行 期间的另一个时间发生,或者根本不会发生!这使得追踪错误变得极其困难,也导致我没有可以重复的完整代码示例。

听起来在堆上分配内存存在一些问题,但我不确定它可能是什么或如何修复它。向量不会导致错误,但在训练神经网络时会让人麻木,比如我正在使用的代码。

我 运行 内存诊断,当错误发生时我还有超过 4gb 的可用 RAM。

随时感谢!如果您还需要其他任何东西,请告诉我,但就像我说的那样,这是一个大型程序并且错误出现 运行dom 所以我正在寻找一个我可能 运行 在分配内存时遇到的一般问题在导致屏幕截图中出现 ntdll.dll!_RtlReportCriticalFailure@12() 错误的堆上。

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

如果可能,您可以使用代码清理器(如 clang)来检查这一点,或者您可以使用 valgrind 等工具来查看它何时发生。