首页 > 解决方案 > C++ 类和空数组

问题描述

您好,我尝试为 Arduino 实现一点机器学习。它也应该在 x86 上运行,以便更容易调试和训练它。

不幸的是,有一些问题(我猜是内存问题)。如果我尝试使用类似的东西。weights[1][1]我得到分段错误。Valgrind 或 gdb 显示内存为空。

我的猜测是这layers = new Layer[5];会导致这个空内存并且layers[1] = Layer(preLayer, 10, afunc);没有像我期望的那样设置内存。

我发现了一些提示来实现类似的东西,Layer& Layer::operator=(const Layer& other) // copy assignment但我不明白为什么。我什至试图以这种方式修复它,但这会导致新问题。

问题:有没有办法避免“空”层?我想避免Layer();layers = new Layer[5];如果明智的话。

//afunc is a function
layers = new Layer[5];
Layer *preLayer = &layers[0];
layers[1] = Layer(preLayer, 10, afunc);

层.h

class Layer
{
    public:
        Layer *preLayer;
        float **weights;
        int weightSize;
        float *biases;
        float *neurons;
        int neuronsSize;
        void (*afunc)(float *);
        Layer();
        Layer(Layer *input, int outputs, void (*afunc)(float *));
        ~Layer();
        void calculateNeurons();
    private:
        Layer(const Layer &layertoCopy); // not implemented
};

层.c

Layer::Layer() {}
Layer::Layer(Layer *preLayer, int neuronsSize, void (*afunc)(float *)): preLayer(preLayer), neuronsSize(neuronsSize), afunc(afunc)
{
    neurons = new float[this->neuronsSize]();
    if(this->preLayer) {
        weightSize = (*this->preLayer).neuronsSize;
        weights = new float*[this->neuronsSize];
        for(int i = 0; i < this->neuronsSize; ++i) {
            weights[i] = new float[weightSize];
        }
        biases = new float[this->neuronsSize]();
    }
}

Layer::~Layer()
{
}

标签: c++arduinoneural-network

解决方案


使用您的示例代码,

layers[1] = Layer(preLayer, 10, afunc);

你有两个问题。在非默认构造函数中,您检查

if(this->preLayer) 

你已经发送了一些不为空的东西,但没有初始化任何东西。

&layers[1] = new Layer(0, 10, afunc);

应该避免这种情况。

但是,如果您制作 astd::vector而不是 c 样式的数组,您可以push_back新建图层,而无需使用指针。

此外,如果您想使用指针,请delete适当地使用它们的析构函数。


推荐阅读