我需要清空 std::vector 吗,然后再删除它?

4

到目前为止,在删除向量之前,我总是使用vector::clear()。但这是必要的吗?难道不是在析构函数中调用vector::clear()函数吗?

// Consider I have this vector
std::vector<uint32_t>* myVector = new std::vector<uint32_t>(50);

... // vector gets filled

myVector->clear();  // <-- redundant??
delete myVector;
myVector = nullptr;

8
你的代码不仅仅在那一行是多余的! - Kerrek SB
5
你为什么要使用new来实例化std::vector?是否有特殊的原因呢? - πάντα ῥεῖ
4
C++不是Java,创建向量时不需要调用new - PaulMcKenzie
2
即使需要在堆栈之外分配向量,请使用智能指针。 std :: unique_ptr非常适合此用途。这是C ++ 14,您的编译器现在应该支持它。尝试auto x = std::make_unique<std :: vector <uint32_t >> (50) - Zan Lynx
2
当我有一个返回std::vector的函数时,我通常使用指针。然后我需要在代码中的某个地方最终删除它。但实际上几乎没有好的理由这样做。这似乎会增加效率,但实际上并不会。 - Chad
显示剩余3条评论
2个回答

10
不需要,因为在销毁 std::vector 时,所有元素都会被析构,所以使用 clear 是多余的。你可以在这里查看 std::vector::~vector 的文档
另外,在问题中动态分配向量通常是不必要的 - 只需通过初始化即可。
std::vector<uint32_t> myVector;
//...

那么当myVector及其所有元素超出范围时,它们将被销毁。


3
不需要手动调用clear。当向量被销毁时,它可能会在内部被调用,但是向量中的任何对象都将以某种方式被销毁,因为向量被销毁。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接