【问题标题】:C++ Add Object to ArrayC++ 将对象添加到数组
【发布时间】:2011-04-12 10:31:48
【问题描述】:

我需要实例化一个对象并将其添加到数组中。这是我目前拥有的一种方法:

Row r;
rows[count] = r;

这里的问题是r 在堆栈上并在函数退出后被删除。我的快速解决方法是使r 静态,但这很糟糕,对吧?我该怎么办? (对不起,完整的 C++ 菜鸟)。

编辑:删除 Row 的解构器可以解决问题。

【问题讨论】:

  • 你的班级有新的/删除的吗?
  • Row 的解构器删除了数组,这就是导致问题的原因。尝试向已释放的数组中添加内容。
  • 能否请您描述一下问题的症状?您可能误诊了其原因。 (这用 C++ 很容易做到!)
  • “编辑:删除 Row 的解构器解决了这个问题。” - 不,它不能解决问题,它只是让它以不同的方式被破坏。那个析构函数的存在是有原因的,对吧?防止内存泄漏。如果您想编写 C++,您真的非常需要阅读 C++ 教程。这不是一种靠猜测就能猜对的语言。
  • @Steve Jessop,同意了。 @Louis 特别需要加强复制构造和分配。

标签: c++ arrays stack


【解决方案1】:

rows[count] = r 行复制对象r 到数组中索引count 处的元素。之后,r 发生什么都没关系,数组不受影响。

[编辑:好的,r 发生的事情间接地很重要——因为副本使用了 r 可以删除的东西。]

如果您习惯于(例如)Java,这令人惊讶,其中数组元素实际上不是一个对象,它只是对一个对象的引用。

【讨论】:

  • 什么不起作用? Row 类是否释放了其析构函数中的任何内容,如果是,它是否有一个 operator= 可以复制任何内容?
  • Yes Row 释放它持有的一个数组并且没有 operator=。
  • Row 类已损坏 - 当您复制对象时,您会复制它的 指针,但这并不能阻止原始对象删除指针指向的内容。困难的解决方法是实现operator= 和一个复制构造函数。简单的解决方法是使用vector 而不是分配的数组,这样您就无需在Row 的析构函数中做任何事情。
  • 没问题。顺便说一句,aaa 就足够了“aaa 鲤鱼”是我的“独角兽”时刻。
  • @Louis 如果您的类有一个非平凡的析构函数,它必须还实现一个复制构造函数和一个赋值运算符才能正常运行。这被称为“三法则”(参见:drdobbs.com/cpp/184401400),它的存在正是为了避免此类问题。
【解决方案2】:

使用std::vector 代替数组,前提是Row 的构造不费力:

std::vector<Row> rows;

Row r;
rows.push_back(r);

当向量超出范围时,将为每个条目调用析构函数~Row()。

您可以使用任一方法访问最近添加的条目

const Row& last = rows.back();

或

size_t count = rows.size();
const Row& last = rows[count - 1];

【讨论】:

    【解决方案3】:

    在这种情况下,您实际上是在堆栈上创建它,然后将对象复制到位置 rows[count]。请注意,如果您将行创建为 Row 对象的数组,则在该位置已经有一个 Row 对象,使用默认构造函数创建,您复制了该对象。

    出于各种原因,在 C++ 中,我们尝试使用标准库容器,例如 std::vector 和 std::list。这些将扩展以处理您添加的新元素。

    【讨论】:

      猜你喜欢
      • 2012-03-11
      • 2022-01-13
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多