【问题标题】:Better way to create objects' array and then deleting them effectively创建对象数组然后有效删除它们的更好方法
【发布时间】:2014-08-28 02:34:18
【问题描述】:

我有一个名为“Menu”的类,该类有一个指向“MenuItem”类对象的指针数组。 Menu 类的前三个相关行如下所示:

class Menu
{
    MenuItem *items[5];

在 Menu 类的构造函数中,我将 items 创建为:

for(int i=0; i<nItems; i++)
{
    items[i] = new MenuItem(titles[i],...); //with all necessary parameters

在 Menu 类的析构函数中,我将 items 删除为:

~Menu()
{
for(int i=0; i<nItems; i++)
    delete items[i];

问题:我的问题是当我调用这个析构函数时,我得到了一个错误Debug Assertion Failed!。除了这个析构函数,一切都很好。如果我不调用此析构函数,则没有错误。我想知道如何解决这个问题?我想删除这个数组,让我的记忆变得干净。

【问题讨论】:

  • 如果nItems
  • 在我的程序中是的nItems=4
  • 但是断言是什么?
  • 我对此一无所知!
  • 内存管理很棘手;您可能没有正确遵循Rule of Three。为什么不使用专门为正确管理内存而设计的std::vector 和/或std::unique_ptr,而不是玩弄指针并希望得到最好的结果?

标签: c++ arrays


【解决方案1】:

如果没有更多上下文,很难说你的问题是什么(尽管我敢打赌复制构造函数和/或赋值运算符的问题,或者nItems 的值错误)。

管理这些原始指针的更好方法是一开始就没有它们。

考虑:

智能指针数组:

std::unique_ptr<MenuItem> items[5];

或者一个std::array 的智能指针:

std::array<std::unique_ptr<MenuItem>, 5> items;

或者一个vector&lt;&gt; 的智能指针:

std::vector<std::unique_ptr<MenuItem>> items;

【讨论】:

  • 我将如何初始化 MenuItem 的这些向量?
  • @AliMohyudin 使用 items.push_back(std::unique_ptr&lt;MenuItem&gt;(new MenuItem(...))); 希望这会有所帮助。
  • 哦,好吧!正因为如此,我将不得不更改我的代码中的所有内容!但无论如何我都会尝试一下!
  • @AliMohyudin 不多,你会看到的。另一方面,您不需要析构函数(也不需要赋值运算符),这样可以避免更多错误。
  • 再问一个问题:是不是需要从这个向量中删除数据?
【解决方案2】:

我认为您发布的代码没有任何问题。

虽然断言发生在对象被销毁时,但明显的错误发生在其他地方;在对象生命周期的某个时间点,有些东西被乱写了。

这种调试断言并不意味着“错误现在发生了!”。它的意思是“这个错误发生在前一段时间,我才注意到它!”,基本上。

在代码的其他地方寻找错误。有许多调试工具可以检测代码并尝试识别未定义的行为,例如踩踏未初始化或未分配的内存。

【讨论】:

  • 实际上我的程序工作得很好,没有在析构函数中删除对象的数组。
  • 代码的其他部分显然会导致内存损坏。这就是调试断言告诉你的。如果您没有显式取消分配为该对象分配的内存,则该进程将简单地终止。无需从堆中进一步分配或取消分配内存,因此不会发现此问题。不幸的是,忽略一个问题不会让它消失。如果您必须在程序中添加更多代码或逻辑,如果您需要以某种方式对其进行更改,那么您很可能无论如何都会遇到此断言,立即终止它。
  • 我发现了这个错误,我不需要为一个简单的对象(Menu 类)调用析构函数(不是指向 Menu 类的指针)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 2018-11-09
  • 2017-12-31
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多