C++ - 当向量保存对象时是否调用析构函数?
如果我在向量内动态分配类的对象,如果我使用clear(),是否会调用每个对象的析构函数?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如果我在向量内动态分配类的对象,如果我使用clear(),是否会调用每个对象的析构函数?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
“动态分配”到底是什么意思?如果您使用
vector
那么就可以了。如果您通过vector
放入指针,则析构函数将不会被调用,因为指针本身没有析构函数。但请注意,在
vector
情况下,您可能会发现构造函数和析构函数的调用次数比您预期的要多得多,例如在调整向量大小时,因为向量在移动内存中的对象(如果需要)。您可以使用 Boostshared_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 viavector<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 Boostshared_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, andvector<shared_ptr<foo> >
if they're expensive or hard/impossible to copy. Never usevector<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.是的,它们都已正确清理。
来自此链接:
即将到来的
[sequence.reqmts]
部分标准也明确了这一点:Yes, they are all cleaned up properly.
From this link:
The
[sequence.reqmts]
section of the upcoming standard also makes this clear: