2016-10-09 1 views
-2

Wie im Titel erwähnt, wie Sie den Speicher löschen, der nach dem Löschen eines Elements aus Array zugewiesen wurde. Hier ist mein Code:Entfernen Sie ein Element aus dem Array und den ihm zugewiesenen freien Speicher

// VectorGraphic.h 
#include "GraphicElement.h" 
#include <string> 
#ifndef VECTOR_GRAPHIC_H 
#define VECTOR_GRAPHIC_H 

class VectorGraphic 
{ 
    unsigned int numGraphicElements; 
    GraphicElement* pElements; 
public: 
    VectorGraphic(){   
     numGraphicElements = 0; 
     //pElements = new GraphicElement(); 
     pElements = new GraphicElement[sizeof(GraphicElement)+1]; 
    } 
    ~VectorGraphic() 
    {      
     if (pElements){ 
      delete[]pElements; 
      //pElements = NULL; 
     } 

    } 

    void DeleteGraphicElement(){ 
     cout << "Deleting a Graphic Element" << endl; 
     cout << "Please enter the index of the Graphic Element you wish to delete" << endl; 
     int index; 
     cin >> index; 
     if (index > numGraphicElements){ 
      cout << "Element is not found at specified index"; 
      return; 
     } 
     else{ 
      for (int i = 0; i < numGraphicElements; i++){ 
       if (i == index){ 
        for (int j = i; j < numGraphicElements - 1; j++){ 
         pElements[j] = pElements[j + 1]; 
        } 
        //delete pElements[numGraphicElements - 1]; //<-Here. This statement shows an error saying "Expression must have pointer type." 
        numGraphicElements--; 

        cout << "Graphic Element deleted successfully" << endl; 
        break; 
       } 
      } 

     } 

    } 
}; 

#endif 

kommentierte ich habe die Linie in DeleteGraphicElement() Funktion, bei der Anforderungs-/Fehler. Ich versuchte mit delete pElements[numGraphicElements - 1];, aber diese Aussage zeigt einen Fehler, der sagt "Ausdruck muss Zeigertyp haben."

+2

Das ist kompliziert. Sie müssen das letzte Element löschen und verschieben, da Arrays kontinuierlich sind, können Sie nicht einfach ein Element in der Mitte freigeben. – Rakete1111

+0

Was hat Sie dazu gebracht zu glauben, dass Sie beim Löschen eines Elements aus dem Array "Speicher freigeben" müssen? Aufgrund der knappen Informationen sehe ich nichts, was befreit werden müsste. –

+2

Besser nicht selbst 'new' und' delete' verwenden. Drücken Sie die Last, um sie zu [Smartpointern] (http://en.cppreference.com/w/cpp/memory) oder Standardcontainern zu bringen. –

Antwort

2

Sie müssten ein Array von Zeigern haben, um delete ein einzelnes Element Ihres Arrays zu haben.

Sie können alle folgenden Elemente um eine Stelle zurückverlagern, aber eine Neuzuweisung von new Ed-Speicher ist mit den Standardwerkzeugen nicht möglich.

Oder Sie können ein neues Array zuweisen und alle gewünschten Elemente kopieren.

Aber der einfachste Weg ist einfach std::vector und std::vector::erase zu verwenden. Auf diese Weise müssen Sie sich nicht um die rule of three/five/zero, die Sie gerade brechen, kümmern.

+2

Das ist eine wirklich gute Antwort für eine schlechte Frage. –

Verwandte Themen