【问题标题】:How can I delete an object from a pointer to a pointer array?如何从指向指针数组的指针中删除对象?
【发布时间】:2019-03-06 23:14:12
【问题描述】:

我还是 C++ 中手动销毁的新手(来自带有垃圾收集的语言)。我的一门课有以下内容:

Input** Inputs;

初始化如下:

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

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

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

这样做的问题是,由于释放旧对象,在该位置重新分配对象时,它可能会导致内存泄漏。

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

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

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

【问题讨论】:

  • 在现代 C++ 中,您应该更喜欢 std::vector 和智能指针而不是手动管理内存
  • 最好的建议是对@UnholySheep 的评论稍作扩展:除非你真的必须这样做,否则不要new 的东西。推荐阅读:Why should C++ programmers minimize use of 'new'?
  • 对不起,我忘了包括 - 这是在一个微控制器上,据我所知,它不支持智能指针。我会更新标签/问题。不过,感谢您的回复
  • 在微控制器上,您甚至不太可能希望频繁地分配和取消分配对象(如果有的话)。它冒着内存碎片化的风险。
  • 您的 Arduino 编译器是否支持C++11?如果是这样,编写一个std::unique_ptr 类型的智能指针并不太难。

标签: c++ pointers arduino destruction


【解决方案1】:

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

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

无需再担心内存泄漏。您拥有的另一个选项是使用 std::shared_ptr,具体取决于您打算如何使用 InputList;

【讨论】:

  • 这个我可以落后。
  • 也就是说,它确实引出了一个问题,提问者是否需要动态分配?
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    如果要删除堆中的对象:

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

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

    定义数组的最大大小。喜欢:

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

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

    【讨论】:

    • 这在代码中没有上下文,请提供一些关于您要实现的目标的解释。
    • 我以为他在问如何删除旧对象?
    • 这不是我想要的。你有代码,它做一件事,它做什么?为什么是正确的?上下文或主题是什么?基本上,你需要解释自己。看看安迪和 cplusplusrat 的答案。他们有代码,但会解释为什么他们的答案是正确的,并解释他们在做什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 2011-05-10
    • 2015-08-09
    • 2011-05-02
    • 2015-07-15
    • 2016-12-23
    相关资源
    最近更新 更多