Элемент weights
инициализируется до инициализации insN
. Доступ к значению insN
для выполнения этого дает неопределенное поведение, и неопределенный объем памяти выделяется оператором new
. Это является причиной исключения, которое сообщает bad_array_new_length
(на практике выделенное число, вероятно, превышает доступную память на вашем компьютере, хотя это просто случайность с вашим компилятором).
Это происходит до инициализации insN
в конструкторе.
Одним частичным исправлением для этого будет удаление инициализатора из тела класса И изменение конструктора на
neuron(int _insN, int _funtype) : insN(_insN), funtype(_funtype), weights(new float[_insN])
{}
Даже если это исправлено, у вашего кода также есть множество других проблем. Я приведу здесь неполный список.
std::vector
предполагает, что его элементы имеют конструктор рабочей копии и оператор присваивания. Ваш класс нет, поэтому не играет по правилам. Это означает, что копирование элементов (как, например, может происходить всякий раз при изменении размера вектора) приведет к созданию объектов, которые будут вести себя некорректно (например, изменение элемента weights
в одном объекте приведет к непреднамеренному изменению элемента в другом объекте). Посмотрите (например, с помощью Google) «правило трех» или «правило пяти», чтобы решить эту проблему. А еще лучше, сделайте weights
a std::vector<float>
вместо указателя и следуйте «правилу нуля».
Ваш класс не определяет деструктор, поэтому память, выделенная для weights
с использованием оператора new
- для каждого объекта - никогда не освобождается. Следовательно, у вас есть утечка памяти - всякий раз, когда создается экземпляр вашего neuron
. Снова ищите «правило трех», «правило пяти» или «правило нуля», чтобы найти подход к решению этой проблемы.
Некоторые из вышеприведенных комментариев применимы и к вашему layer
классу.