Heim > Backend-Entwicklung > C++ > Wie können Sie Zeiger in einem Vektor sicher löschen, ohne die Objekte zu zerstören, auf die sie zeigen?

Wie können Sie Zeiger in einem Vektor sicher löschen, ohne die Objekte zu zerstören, auf die sie zeigen?

Patricia Arquette
Freigeben: 2024-10-31 03:51:31
Original
399 Leute haben es durchsucht

 How Do You Safely Delete Pointers in a Vector Without Destroying the Objects They Point To?

vector::erase(): Zeiger ohne Objektzerstörung löschen

Problem:

Ein Vektor von Objektzeigern erfordert die Entfernung eines Elements unter Beibehaltung des Objekts selbst. Es bestehen jedoch Bedenken hinsichtlich der möglichen Zerstörung des Objekts beim Entfernen.

Antwort:

vector::erase() entfernt effektiv Elemente aus einem Vektor und ruft den Destruktor auf . Beim Umgang mit Zeigern greift der Destruktor jedoch nicht in die Zerstörung des eigentlichen Objekts ein. Dies liegt daran, dass der Container nicht den Besitz der Objekte übernimmt, auf die verwiesen wird.

Lösung:

Um die Objekte, auf die verwiesen wird, zu löschen, ist eine explizite Verwendung unbedingt erforderlich der Löschoperator für jeden Zeiger. Hier ist ein veranschaulichender Codeausschnitt:

<code class="cpp">void clearVectorContents( std::vector <YourClass*> &amp; a ) 
{    
    for ( int i = 0; i < a.size(); i++ ) 
    {       
        delete a[i];    
    }    
    a.clear(); 
} 
Nach dem Login kopieren

Achtung:

Das Speichern von Rohzeigern in Standardcontainern wird nicht empfohlen. Erwägen Sie stattdessen die Verwendung von boost::shared_ptr, um die Ressourcenzuweisung mit Zeigern effektiv zu verwalten.

Elegante Lösung:

Für einen vielseitigeren und effizienteren Ansatz implementieren Sie einen zu löschenden Funktor Zeiger im Vektor. Hier ist eine 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>
Nach dem Login kopieren

Der Aufruf dieses Funktors mit for_each bietet eine schnelle und prägnante Lösung:

<code class="cpp">for_each( myclassVector.begin(),myclassVector.end(),
          DeleteVector<myclass*>());</code>
Nach dem Login kopieren

wobei myclassVector den Vektor bezeichnet, der Zeiger auf myclass-Objekte enthält.

Diese Strategie stellt sicher, dass alle Objekte, auf die verwiesen wird, sicher entfernt werden und gleichzeitig die Integrität des Vektors erhalten bleibt.

Das obige ist der detaillierte Inhalt vonWie können Sie Zeiger in einem Vektor sicher löschen, ohne die Objekte zu zerstören, auf die sie zeigen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage