vector::erase(): Deleting Pointers Without Object Destruction
Problem:
A vector of object pointers requires the removal of an element while preserving the object itself. However, concerns arise regarding the potential destruction of the object upon removal.
Answer:
vector::erase() effectively removes elements from a vector and invokes the destructor. However, when dealing with pointers, the destructor does not intervene with the destruction of the actual object. This is because the container does not take ownership of the pointed-to objects.
Solution:
To expunge the pointed-to objects, it is imperative to explicitly employ the delete operator on each pointer. Here's an illustrative code snippet:
<code class="cpp">void clearVectorContents( std::vector <YourClass*> & a ) { for ( int i = 0; i < a.size(); i++ ) { delete a[i]; } a.clear(); }
Caution:
Storing raw pointers in standard containers is not advised. Instead, consider utilizing boost::shared_ptr to effectively manage resource allocation with pointers.
Elegant Solution:
For a more versatile and efficient approach, implement a functor to delete pointers in the vector. Here's an illustration:
<code class="cpp">// Functor for deleting pointers in vector. template<class T> class DeleteVector { public: // Overloaded () operator. // This will be called by for_each() function. bool operator()(T x) const { // Delete pointer. delete x; return true; } };</code>
Invocating this functor with for_each provides a swift and concise solution:
<code class="cpp">for_each( myclassVector.begin(),myclassVector.end(), DeleteVector<myclass*>());</code>
where myclassVector denotes the vector holding pointers to myclass objects.
This strategy ensures that all pointed-to objects are safely eliminated while preserving the integrity of the vector.
The above is the detailed content of How Do You Safely Delete Pointers in a Vector Without Destroying the Objects They Point To?. For more information, please follow other related articles on the PHP Chinese website!