Vector::Erase 会破坏指针向量中的对象吗?
处理包含对象指针的向量时,使用向量擦除元素::erase() 引发了对所指向对象的命运的担忧。虽然 vector::erase() 从向量中删除元素,但它不会自动销毁实际对象。
Vector::Erase 的行为
Vector::擦除()从向量中删除元素,但不拥有销毁对象的所有权。但是,如果包含的对象是原始指针,则 vector::erase() 在删除之前不会调用其析构函数。
处理原始指针
以确保正确的资源管理中,必须显式删除每个包含的指针来删除它们指向的对象。这可以使用循环来实现:
<code class="cpp">void clearVectorContents(std::vector<YourClass *> &a) { for (int i = 0; i < a.size(); i++) { delete a[i]; } a.clear(); }
避免原始指针
通常不鼓励在标准容器中存储原始指针。对于动态分配的对象,请考虑使用像 boost::shared_ptr 这样的智能指针来处理内存管理。
通用而优雅的解决方案
更优雅的解决方案利用模板和 for_each算法:
<code class="cpp">// Functor for deleting pointers in vector template<class T> class DeleteVector { public: void operator()(T x) const { delete x; } };</code>
此函子可以与 for_each 一起使用来删除向量中的指针:
<code class="cpp">for_each(myclassVector.begin(), myclassVector.end(), DeleteVector<myclass *>());</code>
示例用法
考虑指向 myclass 对象的指针向量。以下代码分配、打印和删除对象:
<code class="cpp">#include <iostream> #include <vector> #include <algorithm> #include <functional> class myclass { public: int i; myclass(): i(10) {} }; // Functor for deleting pointers in vector template<class T> class DeleteVector { public: void operator()(T x) const { delete x; } }; int main() { // Vector of myclass pointers std::vector<myclass *> myclassVector; // Add objects to the vector for (int i = 0; i < 10; i++) { myclassVector.push_back(new myclass); } // Print object values for (int i = 0; i < myclassVector.size(); i++) { std::cout << " " << (myclassVector[i])->i; } // Delete objects using functor and for_each for_each(myclassVector.begin(), myclassVector.end(), DeleteVector<myclass *>()); // Clear the vector myclassVector.clear(); // Print the empty vector size std::cout << "\n" << myclassVector.size(); return 0; }</code>
以上是`vector::erase()` 是否会销毁指针向量中的对象?的详细内容。更多信息请关注PHP中文网其他相关文章!