我仍然不熟悉C ++中的手动销毁(来自具有垃圾回收功能的语言)。我的一门课有以下内容:
Input** Inputs;
哪个初始化如下:
this->Inputs = new Input* [totalInputs];
然后可以根据用户输入将其重新分配到我的代码中,类似于以下内容:
this->Inputs[inputNumber] = new DigitalInput(params...)
问题是由于释放旧对象而在该位置重新分配对象时,它很容易发生内存泄漏。
重新分配旧对象后,删除旧对象的最佳方法是什么?
编辑:我忘了包含在Arduino代码库上运行的AVR微控制器上。
编辑2:之所以这样做,是因为允许用户将命令发送到将更改输入类型的单元(即:发送命令和this->Inputs[inputNumber] = new AnalogInput(params...)
。)也是原因它是指向指针数组的指针,这是因为该对象的构造函数将基于传入的totalInputs
参数生成该数组。该数组位于一个共享库中,该库在几个不同的单元上使用。
答案 0 :(得分:5)
最好不要使用原始指针,而要使用stl容器。一种可能的方法如下。
IndicatorID
无需再担心内存泄漏。您还有另一个选择是使用using InputPtr = std::unique_ptr<Input>;
std::vector<InputPtr> Inputs;
Inputs.emplace_back(std::make_unique<DigitalInput>());
,具体取决于您打算如何使用InputList;
答案 1 :(得分:1)
如果您要重新分配数组的成员以指向新对象,则可以首先取消分配旧对象(如果有)。
Input* oldInput = this->Inputs[inputNumber];
delete oldInput;
this->Inputs[inputNumber] = new DigitalInput(params...)
答案 2 :(得分:-1)
如果要删除堆中的对象:
std::shared_ptr
;
编辑: 如果您使用的是微控制器,则最好在堆栈上分配。
定义阵列的最大大小。喜欢:
for(int i = 0; i < totalInputs; ++i)
delete Inputs[i];
delete[] Inputs
然后将对象分配给它。