C ++ :: vector如何保存自己的类

时间:2016-03-02 18:08:27

标签: c++ vector

这是我自己的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;

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

更新

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

1 个答案:

答案 0 :(得分:6)

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

在您的代码中,当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来保证不会执行任何副本。