2016-05-18 17 views
0

Ich habe eine einfache Array-Klasse, die Vorlage verwendet und eine Größe haben. Ich möchte die Größe ändern, wenn sie voll ist, aber mein Programm stürzt ständig ab. der Code wie folgt aus:C++ Array Größe Absturz

template<class T> 
class Buffer:public File_ptr 
{ 

    unsigned int siz; 
    T *data; 


public: 

    ///konstruktor(size,filename,openmode) 
    Buffer(unsigned int s=50,const char* n, const char* m):File_ptr(n,m),siz(s) 
    { 
     data= new T[siz]; 
     for(unsigned int i=0; i<siz; ++i) 
     { 
      data[i]=0; 
     }; 
    }; 

    ///destruktor 
    ~Buffer() 
    { 
     delete[] data; 
    } 

    ///operator[] 
    T& operator[](unsigned int i) 
    { 
     if(i>siz) 
     { 
      unsigned int newsize=siz*2; 
      T* tmp=new T[newsize]; 
      for(unsigned int j = 0; j < siz; j++) 
      { 
       tmp[j] = data[j]; 
      } 
      siz=newsize; 
      delete[] data; 
      data=tmp; 
      delete[] tmp; 
     }; 
     return data[i]; 
    } 

}; 

der Fehler kommt bei dem Operator [] (zumindest glaube ich).. Das Hauptprogramm ist wie folgt aus:

int main() 
{ 
    Buffer<int> k(20,"k.txt","w"); 
    Buffer<char*> s(20,"s.txt","w"); 
    k.printfile("HEY"); 
    s.printfile(5); 
    for(unsigned int i=0;i<23;i++){ 
    s[i]="Hey"; 
    cout << s[i] << endl; 
    } 


return 0; 
} 

Jede Hilfe wäre toll! :) Danke!

Antwort

0

Sie erhalten einen Segmentierungsfehler, weil Sie den Speicher zweimal löschen.

data=tmp; 
delete[] tmp; 

Hier ordnen Sie data der Speicherplatz von tmp. So weit so gut, data und tmp zeigen auf den gleichen Speicherbereich. Aber jetzt hast du delete[] temp;, und so ist der Speicherbereich gelöscht. Aber weil data auch darauf zeigt, ist data auch nicht mehr gültig, um als Zeiger verwendet zu werden (wie tmp).

Dann versuchen Sie mit return data[i]; auf diesen Speicher zugreifen, aber Sie haben es gelöscht! Sie erhalten also einen Segmentierungsfehler.

Sie können dieses Problem beheben, indem nicht delete[] tmp;, weil dann data auf einen gültigen Speicherort, und alles ist gut :)

+0

Vielen Dank! Es funktionierte! :)) –

0

Sie Ihre frischen Array löschen, indem tmp im operator[] verwiesen noch. Da dies das neue Array ist, das von data referenziert wird, geraten Sie unweigerlich in Schwierigkeiten.

0

Sie haben ein paar Probleme. Das erste Problem ist, dass Sie den Speicher löschen, der tmp zeigt, auf den auch data zeigt. Dies bedeutet, dass Sie beim nächsten Wachstum des Arrays auf einen gelöschten Zeiger zugreifen, der ein nicht definiertes Verhalten aufweist.

Ein zweites Problem ist, dass if(i>siz) Kontrollen sind i über das Ende des Arrays ist, aber Sie überprüfen nie i ist auch größer als newsize zu sehen. Sie müssen newsize auf den größten von siz * 2 und i setzen. Auch ist es für den Bediener [] unintuitiv, den Behälter anzubauen. Wenn Sie [] mit einer Größe aufrufen, die größer als der Container ist, sollte das ein Fehler sein, anstatt das Array zu ändern.