2 Stimmen

Das Freigeben im Destruktor verursacht ein Speicherleck

Ich muss für meine Aufgabe eine Stapelklassenvorlage mit Arrays in C++ schreiben.

Ici ist mein Code:

#include <iostream>

template <typename Type>
class Stack {
private:
  int top;
  Type items[];
public:
  Stack()  { top = -1; };
  ~Stack() { delete[] items; };
  void push(Type);
  bool isEmpty() const;
  Type pop();
  Type peek() const;
};

int main (int argc, char *argv[]) {
  Stack<double> st;
  return 0;
}

template<typename Type>
void Stack<Type>::push(Type item) {
  top++;
  if(top == sizeof(items) / sizeof(Type)) {
    Type buff[] = new Type[top];
    std::copy(items,items+top,buff);
    delete[] items;
    items = new Type[2*top];
    std::copy(buff,buff+top,items);
    delete[] buff;
  }
  items[top] = item;
}

template<typename Type>
bool Stack<Type>::isEmpty() const {
  return top == -1 ? true : false;
}

template<typename Type>
Type Stack<Type>::pop() {
  //TODO
  return items[top--];
}

template<typename Type>
Type Stack<Type>::peek() const{
  //TODO
  return items[top-1];
}

Die Kompilierung erfolgte problemlos mit " g++ -Wall "Wenn ich das Programm jedoch ausführe, erhalte ich diesen Fehler:

* glibc erkannt * ./lab3: munmap_chunk(): invalid pointer: 0x00007fff41a3cdf8

Nachdem ich ein wenig mit GDB herumprobiert hatte, fand ich heraus, dass der Fehler durch die Zeile entstand:

'free[] items' in the destructor.

Ich verstehe nicht, warum das Freigeben eines Arrays zu einem Speicherleck führt? Irgendwelche Anhaltspunkte?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X