繁体   English   中英

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

[英]How can I delete an object from a pointer to a pointer array?

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

Input** Inputs;

初始化如下:

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

并可以根据用户输入稍后在我的代码中重新分配,类似于:

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

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

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

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

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

最好不要使用原始指针,而是使用stl容器。 一种可能的方式如下。

using InputPtr = std::unique_ptr<Input>;
std::vector<InputPtr> Inputs;
Inputs.emplace_back(std::make_unique<DigitalInput>());

无需担心内存泄漏。 您还有另一个选择是使用std::shared_ptr这取决于您打算如何使用InputList。

如果要重新分配数组的成员以指向新对象,则可以首先取消分配旧对象(如果有)。

Input* oldInput = this->Inputs[inputNumber];
delete oldInput;

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

如果要删除堆中的对象:

for(int i = 0; i < totalInputs; ++i) delete Inputs[i]; delete[] Inputs for(int i = 0; i < totalInputs; ++i) delete Inputs[i]; delete[] Inputs

编辑:如果您使用的是微控制器,则最好在堆栈上分配。

在阵列上定义最大大小。 喜欢:

const int MAX = 5;
Inputs inputs[MAX][MAX];

然后将对象分配给它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM