如何从指向指针数组的指针中删除对象?
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;
如果要删除堆中的对象:
for(int i = 0; i < totalInputs; ++i)
delete Inputs[i];
delete[] Inputs
;
编辑:
如果您使用的是微控制器,最好改为在堆栈上分配。
定义数组的最大大小。喜欢:
const int MAX = 5;
Inputs inputs[MAX][MAX];
然后只需将对象分配给它即可。
如果要重新分配数组成员以指向新对象,则可以先释放旧对象(如果有)。
Input* oldInput = this->Inputs[inputNumber];
delete oldInput;
this->Inputs[inputNumber] = new DigitalInput(params...)
我对 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;
如果要删除堆中的对象:
for(int i = 0; i < totalInputs; ++i)
delete Inputs[i];
delete[] Inputs
;
编辑: 如果您使用的是微控制器,最好改为在堆栈上分配。
定义数组的最大大小。喜欢:
const int MAX = 5;
Inputs inputs[MAX][MAX];
然后只需将对象分配给它即可。
如果要重新分配数组成员以指向新对象,则可以先释放旧对象(如果有)。
Input* oldInput = this->Inputs[inputNumber];
delete oldInput;
this->Inputs[inputNumber] = new DigitalInput(params...)