如何从指向指针数组的指针中删除对象?

时间:2019-03-06 23:14:13

标签: c++ pointers arduino destruction

我仍然不熟悉C ++中的手动销毁(来自具有垃圾回收功能的语言)。我的一门课有以下内容:

Input** Inputs;

哪个初始化如下:

this->Inputs = new Input* [totalInputs];

然后可以根据用户输入将其重新分配到我的代码中,类似于以下内容:

this->Inputs[inputNumber] = new DigitalInput(params...)

问题是由于释放旧对象而在该位置重新分配对象时,它很容易发生内存泄漏。

重新分配旧对象后,删除旧对象的最佳方法是什么?

编辑:我忘了包含在Arduino代码库上运行的AVR微控制器上。

编辑2:之所以这样做,是因为允许用户将命令发送到将更改输入类型的单元(即:发送命令和this->Inputs[inputNumber] = new AnalogInput(params...)。)也是原因它是指向指针数组的指针,这是因为该对象的构造函数将基于传入的totalInputs参数生成该数组。该数组位于一个共享库中,该库在几个不同的单元上使用。

3 个答案:

答案 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

然后将对象分配给它。