这是我自己的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的内容被复制(或移动)到新的元件。”但是哪一个?复制还是移动?它是如何确定的?
答案 0 :(得分:6)
向量points
正在存储通过Point
(push-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_ptr
或std::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中的移动语义,大多数时候您可能不需要使用类似的东西来管理内存(使用new
和delete
)。
确定传入push_back
的对象是否根据它是否为右值而被复制或移动。有关更多信息,请阅读this answer on move semantics。如上所述,您还可以使用std::vector::emplace_back
来保证不会执行任何副本。