【发布时间】:2019-03-06 23:14:12
【问题描述】:
我还是 C++ 中手动销毁的新手(来自带有垃圾收集的语言)。我的一门课有以下内容:
Input** Inputs;
初始化如下:
this->Inputs = new Input* [totalInputs];
并且可以根据用户输入在我的代码中重新分配,类似于:
this->Inputs[inputNumber] = new DigitalInput(params...)
这样做的问题是,由于释放旧对象,在该位置重新分配对象时,它可能会导致内存泄漏。
重新分配旧对象后,删除旧对象的最佳方法是什么?
编辑:我忘了说明这是在运行在 Arduino 代码库上的 AVR 微控制器上。
编辑2:我这样做的原因是因为允许用户向单元发送命令,这将改变输入类型(即:发送命令和this->Inputs[inputNumber] = new AnalogInput(params...)。也是它的原因指向指针数组的指针是因为该对象的构造函数将根据传入的totalInputs 参数生成该数组。这是在几个不同单元上使用的共享库中。
【问题讨论】:
-
在现代 C++ 中,您应该更喜欢
std::vector和智能指针而不是手动管理内存 -
最好的建议是对@UnholySheep 的评论稍作扩展:除非你真的必须这样做,否则不要
new的东西。推荐阅读:Why should C++ programmers minimize use of 'new'? -
对不起,我忘了包括 - 这是在一个微控制器上,据我所知,它不支持智能指针。我会更新标签/问题。不过,感谢您的回复
-
在微控制器上,您甚至不太可能希望频繁地分配和取消分配对象(如果有的话)。它冒着内存碎片化的风险。
-
您的 Arduino 编译器是否支持
C++11?如果是这样,编写一个std::unique_ptr类型的智能指针并不太难。
标签: c++ pointers arduino destruction