这是我自己的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;
};
Run Code Online (Sandbox Code Playgroud)
在这里,我创建一个点并将其添加到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;
Run Code Online (Sandbox Code Playgroud)
我的问题是:矢量制作Point的副本并存储它(所以我也需要delete p;),或者它是否存储之前创建的一个实例?
更新:
我在这里读到push_back"在向量的末尾添加一个新元素,在其当前的最后一个元素之后.val的内容被复制(或移动)到新元素." 但是哪一个?复制还是移动?它是如何确定的?
向量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
Run Code Online (Sandbox Code Playgroud)
否则,如果您需要动态分配,请使用类似std::unique_ptr或std::shared_ptr(或另一个智能指针)的内容,以便在向量被破坏时,包含的指针也是如此.
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));
Run Code Online (Sandbox Code Playgroud)
通常,在C++ 11中使用移动语义,大多数情况下您可能不需要使用类似的东西来管理内存(使用new和delete).
确定是否push_back根据是否是右值来复制或移动传入的对象.有关更多信息,请阅读有关移动语义的此答案.如上所述,您还可以使用std::vector::emplace_back以确保不执行任何副本.