C++ - 当向量保存对象时是否调用析构函数?

发布于 2024-11-15 12:08:01 字数 51 浏览 1 评论 0 原文

如果我在向量内动态分配类的对象,如果我使用clear(),是否会调用每个对象的析构函数?

If I dynamically allocate objects of a class inside a vector, is the destructor for each object called if I use clear()?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

丢了幸福的猪 2024-11-22 12:08:01

“动态分配”到底是什么意思?如果您使用 vector 那么就可以了。如果您通过 vector​​ 放入指针,则析构函数将不会被调用,因为指针本身没有析构函数。

但请注意,在 vector 情况下,您可能会发现构造函数和析构函数的调用次数比您预期的要多得多,例如在调整向量大小时,因为向量在移动内存中的对象(如果需要)。您可以使用 Boost shared_ptr 来解决这个问题,但由于引用计数簿记,性能成本很小。

我的建议:如果对象的复制和销毁成本较低,请使用 vector,而 vector 则可以。 > 如果它们很昂贵或难以/无法复制。永远不要使用 vector​​ 除非你特别想避免让向量处理内存管理,然后才要小心;恕我直言,这很少是一个好主意。

What do you mean by "dynamically allocate" precisely? If you use a vector<foo> then you are fine. If you are putting pointers in via vector<foo*> then destructors will not get called, because the pointers don't have destructors per se.

Note, however, that in the vector<foo> case, you may find your constructors and destructors called a lot more than you expect e.g. when the vector is resized, because the vector will use them when moving the objects in memory if it needs to. You can use a Boost shared_ptr to get around that, though there is a small perf cost due to the reference-count bookkeeping.

My advice: use vector<foo> if the objects are cheap to copy and destroy, and vector<shared_ptr<foo> > if they're expensive or hard/impossible to copy. Never use vector<foo*> unless you specifically want to avoid having the vector handle memory management, and only then be careful; it's rarely a good idea IMHO.

初吻给了烟 2024-11-22 12:08:01

是的,它们都已正确清理。

来自此链接

向量的所有元素都被删除:调用它们的析构函数,然后将它们从向量容器中删除,使容器的大小为 0。

即将到来的 [sequence.reqmts] 部分标准也明确了这一点:

a.clear() 销毁 a 中的所有元素,使引用 a 元素的所有引用、指针和迭代器无效,并且可能会使尾后迭代器无效。

Yes, they are all cleaned up properly.

From this link:

All the elements of the vector are dropped: their destructors are called, and then they are removed from the vector container, leaving the container with a size of 0.

The [sequence.reqmts] section of the upcoming standard also makes this clear:

a.clear() destroys all elements in a, invalidates all references, pointers, and iterators referring to the elements of a and may invalidate the past-the-end iterator.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文