C++类和空数组

C++ class and empty arrays

本文关键字:数组 C++      更新时间:2023-10-16

你好,我尝试为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()
{
}

使用您的示例代码,

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

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

if(this->preLayer) 

您发送了一些不为空的东西,但没有初始化任何内容。

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

应该避免这种情况。

但是,如果您创建一个std::vector而不是 c 样式数组,则可以push_back新图层,而无需使用指针。

此外,如果要使用指针,请使析构函数适当地delete指针。

当您编写"layers = new Layer[5]"时,您的图层首先使用默认构造函数创建。也许尝试:

Layer** layers = new Layer*[5];
Layer* prevLayer = nullprt;
for(int i=0;i<5;i++){
layers[i]=new Layer(prevLayer,10,afunc);
prevLayer=layers[i];
}