c++ - 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()
{
}
解决方案
使用您的示例代码,
layers[1] = Layer(preLayer, 10, afunc);
你有两个问题。在非默认构造函数中,您检查
if(this->preLayer)
你已经发送了一些不为空的东西,但没有初始化任何东西。
&layers[1] = new Layer(0, 10, afunc);
应该避免这种情况。
但是,如果您制作 astd::vector
而不是 c 样式的数组,您可以push_back
新建图层,而无需使用指针。
此外,如果您想使用指针,请delete
适当地使用它们的析构函数。
推荐阅读
- python - 打印 python ceasar cypher 时的间距问题
- queue - ServiceBusTrigger 在连续网络作业上使用 ReceiveDelete
- java - 将 kotlin 项目从 pom.xml 转换为 build.gradle
- python - 如何对数据进行分类以获得树状结构
- python - 在我写的一篇文章上运行 QA,我不知道为什么最后一个 if 语句不会返回任何东西
- sql - 根据条件和相同的主键将一个表中的金额带入另一个表
- windows - Windows 批处理脚本、快捷方式和其他非实时 cmd 方法真的需要双与号 (&&) 吗?
- mysql - 如何使用 msum 仅对 DolphinDB 中的正数求和
- tensorflow - 图像分类迁移学习需要负样本吗?
- android - 如何在活动中注入模拟类?