Ошибка C ++ при инициализации указателя на указатель - PullRequest
0 голосов
/ 12 апреля 2019

Я использую большую кодовую базу, так что извините, что я не включил весь исходный код. Я подытожу эту проблему как можно лучше, и, надеюсь, этого достаточно, чтобы дать некоторую интуицию в ответ.

При создании указателя на указатель (используется как динамический массив указателей) я получаю ошибку где-то в куче, см. Изображение ниже для стека вызовов:

Error

все setFrontNodes ():

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

Где заголовок для моего класса Node:

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

Теперь вот странная проблема. Ошибка произойдет случайно. Я буду запускать ту же программу с теми же параметрами и всем остальным, и ошибка будет или там, или в другое время во время работы, или вообще не будет! Это крайне затрудняет отслеживание ошибки и почему у меня нет полного примера кода, который можно повторить.

Звучит так, будто есть какая-то проблема с выделением памяти в куче, хотя я не уверен, что это может быть или как это исправить. Векторы не вызывают ошибок, но очень медлительны при обучении нейронных сетей, таких как код, для которого я использую.

Я выполнил диагностику памяти, и у меня все еще остается более 4 ГБ свободной памяти, когда происходит ошибка.

Спасибо за любое время! Дайте мне знать, если вы хотите что-нибудь еще, но, как я уже сказал, это большая программа, и ошибка выглядит случайной, поэтому я ищу общую проблему, с которой я мог столкнуться при выделении памяти в куче, которая вызывает ntdll.dll ! _RtlReportCriticalFailure @ 12 () ошибка на скриншоте.

1 Ответ

1 голос
/ 12 апреля 2019

Как прокомментировал Игорь Тандетник, ошибка такого рода, вероятно, связана либо со значением мусора для size, либо с повреждением кучи.Убедитесь, что size является действительным числом, и убедитесь, что вы не записываете в память, к которой вы не должны прикасаться (так как это может повредить кучу).

Если возможно, вы можете использовать дезинфицирующее средство для кода (например, clang), чтобы проверить это, или вы можете использовать инструмент, такой как valgrind, чтобы увидеть, когда это произойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...