这是我自己的点类(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 “在 vector 的末尾添加一个新元素,在其当前最后一个元素之后。val 的内容被复制(或移动) 到新元素。”但是哪一个?复制还是移动?它是如何确定的?
最佳答案
vector points
正在存储通过 push-back
传递的 Point
的拷贝(*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 )以便当 vector 被破坏时,包含的指针也是如此。
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
以保证不执行任何拷贝。
关于C++::vector如何保存自己的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35754891/