【问题标题】:C++ :: How does vector saving own classC++ :: 向量如何保存自己的类
【发布时间】:2016-03-02 18:08:26
【问题描述】:

这是我自己的 Point 类 (Point.h):

class Point {
public:
    Point(double x, double y, double z);
    Point(const Point& orig);
    virtual ~Point();
    double getX();
    double getY();
    double getZ();
    void writeOut();
private:
    double x, y, z;
};

这里我创建一个点并将其添加到vector<Point> (main.cpp):

Point* p = new Point(0.1,0.2,0.3);
vector<Point>* points = new vector<Point>;
points->push_back(*p);
//doing stuff
delete points;

我的问题:vector 是复制 Point 并存储它(所以我也需要 delete p;),还是存储之前创建的一个实例?

更新:

我读到 here 说 push_back “在向量的末尾添加一个新元素,在其当前最后一个元素之后。val 的内容被复制(或移动)到新元素。 "但是哪一个?复制还是移动?它是如何确定的?

【问题讨论】:

  • C++ 不是 Java 或 C#。您不需要所有这些对new 的调用来创建对象。 Point p(0.1, 0.2, 0.3); vector&lt;Point&gt; points; points.push_back(p);
  • 你存储p指向的对象的副本
  • 为什么所有这些new / delete 的东西。你这样做有什么特别的理由吗?
  • @πάνταῥεῖ 是的,我的原始代码比这更复杂,我为这个问题简化了它。 (而且我喜欢新建和删除)
  • 如果您简化到大量指针,我建议暂停并重新考虑。

标签: c++ vector


【解决方案1】:

向量points 正在存储通过push-back (*p) 传递的Point 的副本。

在您的代码中,当points 被破坏(通过delete)时,包含的对象将被破坏,但不会破坏您使用new Point (p) 创建的指针,因为创建了一个副本。

如果您需要使用动态分配(在这种情况下您似乎不需要),只需将所有内容视为堆栈分配的对象并传递它。

Point p{ 0.1, 0.2, 0.3 };
std::vector<Point> points;
points.push_back(p);
// Do stuff with points

否则,如果您需要动态分配,请使用std::unique_ptrstd::shared_ptr(或另一个smart pointer)之类的东西,这样当向量被破坏时,所包含的指针也一样。

Point *p = new Point{ 0.1, 0.2, 0.3 };
std::vector<std::unique_ptr<Point>> points;
points.push_back(std::make_unique<Point>(0.1, 0.2, 0.3));

通常,使用 C++11 中的移动语义,大多数时候您可能不需要像这样管理内存(使用 newdelete)。

根据是否为右值来判断传入push_back的对象是否被复制或移动。如需更多信息,请阅读this answer on move semantics。如前所述,您还可以使用std::vector::emplace_back 来保证不执行任何复制。

【讨论】:

  • 这确实不能回答在 OPs 代码中是否有必要删除 p 的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 2019-08-14
  • 2013-04-22
  • 2019-02-09
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
相关资源
最近更新 更多