2017-01-27 8 views
0

Hallo, ich bin neu in Zeigern und dynamischen Speicher. Das Programm soll ein Array-basierter Stack sein. Ich brauche Hilfe mit einem Fehler, der auftritt, wenn ich versuche, Speicher zu einer Zeigervariablen zuzuordnen, die _pArr in der H-Datei aufgerufen wird. Wenn ich versuche, ein neues Array mit new double[] zu erstellen, erhalte ich eine "nicht lesbare Erinnerung" -Fehlermeldung, wenn ich den Code debugge. In dem Code unten habe ich ein neues Array in der .cpp-Datei erstellt und dann auf den Zeiger _pArr kopiert, aber ich bekomme immer noch den gleichen Fehler.Unlesbarer Speicher, wenn ich Zeiger-Array in C++ erstellen

class CStack{ 
public: 
    Stack(void); 
    ~Stack(void); 
    . 
    . 
    . 
private: 
    int _capacity=NULL; 
    int _size=0; 
    double* _pArr; 
} 



CStack::CStack(void) 
{ 
    if (_capacity == 0){ 
     _capacity = 10; 
    } 
    else{ 
     _capacity = _capacity * 2; 
    } 
    double* arr; 
    arr = new double [_capacity] 

    _pArr=arr; 

    delete[] arr; 
} 

Warum tritt dieser Fehler auf und wie kann ich ihn beheben?

+0

Was ist 'arr' und warum löschen Sie es im Konstruktor? Ist der Klassenname 'Stack' oder' CStack'? – Barmar

+0

Was ist der Sinn des 'if (_capacity == 0)' Tests? Da dies ein neu erstellter Stapel ist und die Klassendeklaration ihn auf "0" initialisiert, ist er immer "0". – Barmar

+0

Off topic, aber nicht 'NULL' für' int' verwenden. –

Antwort

2

Hier ist, was Ihr Code im Konstruktor tun:

// Allocate memory for an array and set arr to point to that array. 
double* arr; 
arr = new double [_capacity] 

// Set _pArr to point to the same array. 
_pArr=arr; 

// Delete the array that arr and _pArr point to. If you 
// deference _pArr after this, bad things will happen. 
delete[] arr; 

Sie sollten also nicht das Array zu löschen, nachdem Sie sofort zugeordnet. (Es gibt auch ein fehlendes Semikolon.) Wenn Sie das Problem beheben, wird Ihr Problem wahrscheinlich behoben, aber dann müssen Sie das Array im Destruktor der Klasse löschen. Und wenn Sie new[]/delete[] verwenden müssen, wäre es viel einfacher, es in einem einzigen Schritt zu tun, anstatt eine nutzlose temporäre Variable zu erstellen:

CStack::CStack(void) 
{ 
    if (_capacity == 0){ 
     _capacity = 10; 
    } 
    else{ 
     _capacity = _capacity * 2; 
    } 

    _pArr = new double [_capacity]; 
} 

CStack::~CStack(void) 
{ 
    delete[] _pArr; 
} 

Unrelated auf Ihre Frage, aber das Code, verdoppelt _capacity doesn‘ t machen Sie nichts nützliches, da die Kapazität beim Aufruf des Konstruktors immer Null ist. Wenn Sie dafür einen vorhandenen CStack erweitern möchten, müssen Sie ihn in eine Methode einfügen und müssen sich darum sorgen, ein neues Array für den Stack zu erstellen, den Inhalt des alten in den neuen zu kopieren und dann zu löschen das Alte.