2016-11-15 4 views
0

Also hier ist mein Arbeitscode für ein einfaches dynamisches Array. Dies hat ein Beispielcode für eine sehr Einstiegsdatenstruktur Implementierung sein:Debug-Assertion schlägt auf dynamischem Array fehl

#include <iostream> 
using namespace std; 

class AdvancedArray { 
public: 
    AdvancedArray(); 
    ~AdvancedArray(); 
    int get_size() const; // get the number of elements stored 
    double& at(int idx) const; // access the element at idx 
    void push_back(double d); // adds a new element 
    void remove(int idx); // remove the element at idx 
    void clear(); // delete all the data stored 
    void print() const; 

private: 
    double* elements; 
    int size; 
}; 

int main() 
{ 
    AdvancedArray* arr = new AdvancedArray(); 
    cout << "The Array Size is: " << arr->get_size() << endl; 
    cout << "Pusing Values: 1.2, 2.1, 3.3, 4.5 in the Array. " << endl; 
    arr->push_back(1.2); 
    arr->push_back(2.1); 
    arr->push_back(3.3); 
    arr->push_back(4.5); 
    arr->print(); 
    cout << "The Array Size is: " << arr->get_size() << endl; 
    cout << "The Element at Index 2 is: " << arr->at(2) << endl; 
    cout << "Deleting Values: 2.1 from the Array. " << endl; 
    arr->remove(1); 
    cout << "The Array Size is: " << arr->get_size() << endl; 
    arr->print(); 
    cout << "Clearing the Array: " << endl; 
    arr->clear(); 
    cout << "The Array Size is: " << arr->get_size() << endl; 
    arr->clear(); 
    return 0; 
} 

AdvancedArray::AdvancedArray() 
{ 
    size = -1; 
    elements = new double[100]; //Maximum Size of the Array 
} 

AdvancedArray::~AdvancedArray() 
{ 
    delete[] elements; 
} 

int AdvancedArray::get_size() const 
{ 
    if(size < 0) 
    { 
     return 0; 
    } 
    return size; 
} 

double & AdvancedArray::at(int idx) const 
{ 
    if (idx < 100 && idx >= 0 && size > 0) { 
     return elements[idx]; 
    } 
    cout << "Index Out of Bounds." << endl; 
} 

void AdvancedArray::push_back(double d) 
{ 
    if (size >= 100) 
    { 
     cout << "Overflow Condition. No More Space!" << endl; 
    } 
    else 
    { 
     elements[++size] = d; 
     cout << "Element Pushed In Stack Successfully!" << endl; 
    } 
} 

void AdvancedArray::remove(int idx) 
{ 
    if (size >= 100 || size < 0) 
    { 
     cout << "No Such Element Exists!" << endl; 
    } 
    else 
    { 
     for(int i = idx; i <size; i++) 
     { 
      elements[idx] = elements[idx + 1]; 
     } 
     size--; 
     cout << "Element Deleted In Stack Successfully!" << endl; 
    } 
} 

void AdvancedArray::clear() 
{ 
    delete[] elements; 
    size = -1; 
} 

void AdvancedArray::print() const 
{ 
    cout << "[ "; 
    for(int i = 0; i <= size; i++) 
    { 
     cout << elements[i] << " "; 
    } 
    cout << "]" << endl; 
} 

Also jedes Mal, wenn ich versuche, dies zu laufen Ich habe die zwei Probleme:

enter image description here

enter image description here

Was ist falsch an meinem Code? Warum wird der Heap beschädigt (ich habe nach dem Fehlercode gesucht und das muss alles sein)? Verletzt mein Code einige wichtige Zugriffsverletzungen? Ich benutze VS2015.

+0

Denken Sie darüber nach, was passiert, wenn Sie zweimal 'clear' aufrufen. –

+1

... oder löschen Sie den Destruktor. – Mat

+0

@RetiredNinja entfernt eine klare, noch Fehler bleibt bestehen! –

Antwort

5

Sie tun delete [] elementsdrei mal ohne elements-nullptr dazwischen zu setzen. Das führt zu undefined Verhalten zum zweiten Mal (und dritten Mal).

+0

entfernt eine klar, immer noch Fehler! –

+0

@ Jeet.Deir Das ist, weil Sie es * drei * mal tun. Habe gerade meine Frage aktualisiert, entferne den 'clear' Aufruf nicht, setze' elements' auf 'nullptr' und du brauchst dir darüber keine Gedanken zu machen.Dozu machen' delete [] 'auf einem Nullzeiger ist erlaubt –

+0

Besser einfach entferne 'delete []' von clear. Du reservierst nur im Konstruktor. Wenn der Benutzer dein Array löscht und versucht, einen Wert hinzuzufügen, wird es ebenfalls segregieren. – Ari0nhh

2

Wenn size == 99, das folgende Stück Code versucht elements[100] zuzugreifen:

if (size >= 100) 
{ 
    cout << "Overflow Condition. No More Space!" << endl; 
} 
else 
{ 
    elements[++size] = d; 
    cout << "Element Pushed In Stack Successfully!" << endl; 
} 

Sie müssen ++size zu size++ ändern.

+0

Immer noch bekomme ich Heap Korruption entdeckt :( –

+0

Ich sehe klar siehe zweimal aufgerufen – P0W

+0

entfernt eine klar, immer noch Fehler! –