2017-05-26 3 views
0
#include <iostream> 

using namespace std; 

template <class T> 
class myset{ 
private: 
    T *pArray; 
    int size; 

public: 
    myset<T>(){ 
     pArray = new T[0]; 
     int size =0; 
    } 

    void addItem(T iVal){ 
     size++; 
     T* newArray = new T [size];// allocate bigger array // 
     for(int i=0; i< size-1; i++){ 
      newArray[i] = pArray[i]; // IT IS CRASHING BECAUSE OF THIS LINE 
     } 
     pArray[size -1] = iVal; 
     pArray = NULL; 
     pArray = newArray; 
    } 
}; 

int main() 
{ 
    myset<int> a; 
    myset<double> d; 
    a.addItem(3); 
    a.addItem(5); 
} 

Was ich versuche, ist eine dynamische Array von jeder Vorlage zu machen. In meiner Add-Funktion versuche ich, mein altes Array in mein neues Array zu kopieren. Kann mir jemand sagen, warum es nicht funktioniert?Warum stürzt mein Programm bei dieser einen Zeile ab?

+1

Warum überschatten Sie die Größe Ihrer Klasse im Ctor? –

+2

Was haben Sie bei der Verwendung des Debuggers festgestellt? –

+4

* Was ich versuche zu tun ist ein dynamisches Array von jeder Vorlage * - Was ist los mit nur 'std :: vector '? – PaulMcKenzie

Antwort

4

Im Konstruktor deklariert und initialisiert int size =0; eine neue lokale Variable mit dem Namen size. Die Elementvariable myset::size wird nicht initialisiert. Das bedeutet, wenn myset aufgebaut ist, wird myset::size Müll enthalten. I.e. Es könnte bei jedem Wert beginnen.

Außerdem fügen Sie in addItem das Element dem alten Array statt dem neuen hinzu und verwerfen dann den Zeiger auf dieses Array, ohne seinen Speicher freizugeben, was einen Speicherverlust verursacht und das neue Array nichts als Müll enthält .