0

我对 C++ 中的手动销毁仍然很陌生(来自带有垃圾收集的语言)。我的一门课有以下内容:

Input** Inputs;

初始化如下:

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

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

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

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

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

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

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

4

3 回答 3

5

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

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

无需再担心内存泄漏。您拥有的另一个选项是std::shared_ptr根据您打算如何使用 InputList 来使用;

于 2019-03-06T23:22:52.490 回答
1

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

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

this->Inputs[inputNumber] = new DigitalInput(params...)
于 2019-03-06T23:23:02.167 回答
-1

如果要删除堆中的对象:

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

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

定义数组的最大大小。像:

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

然后只需将对象分配给它。

于 2019-03-06T23:22:58.300 回答