Ich versuche es so zu machen, dass sich mein Stack jedes Mal verdoppelt, wenn die Größe überschritten wird. Ich muss einen neuen Stapel erstellen, um den alten Stapel zu halten, aber doppelt so groß. Der alte Stapel muss gelöscht werden. Der folgende Code hält mich eine FehlermeldungWie ordne ich mehr Speicher in dieser benutzerdefinierten Stapelimplementierung korrekt zu?
"Stack (17854,0x7fff77cd0300) malloc: * Fehler für Objekt 0x1001054b0: pointer befreit wurde, einen Haltepunkt in malloc_error_break nicht zugeordnet * gesetzt zu debuggen"
Auch Die Zufallszahlen werden jedes Mal erzeugt, wenn ich mein Programm starte. HILFE!
#include <iostream>
using namespace std;
const int DEFAULT_SIZE = 100;
template< class T >
class Stack {
public:
Stack(int = 10); // default constructor (stack size 10)
// destructor
~Stack() {
delete [] stackPtr;
}
bool push(const T&);
bool pop(T&);
int pop();
// determine whether Stack is empty
bool isEmpty() const {
return top == -1;
}
// determine whether Stack is full
bool isFull() const {
return top == size - 1;
}
private:
int size; // # of elements in the stack
int top; // location of the top element
T *stackPtr; // pointer to the stack
};
// constructor
template< class T >
Stack<T>::Stack(int s) {
size = s > 0 ? s : 10;
top = -1; // Stack initially empty
stackPtr = new T[ size ]; // allocate memory for elements
}
template< class T >
bool Stack<T>::push(const T &pushValue) {
if (!isFull()) {
stackPtr[ ++top ] = pushValue;
return true;
}
T *newPtr = new T[size*2];
newPtr = stackPtr;
delete [] stackPtr;
return true;
}
template< class T >
bool Stack<T>::pop(T &popValue) {
if (!isEmpty()) {
popValue = stackPtr[ top-- ]; // remove item from Stack
return true;
}
return false;
}
template <class T>
int Stack<T>::pop() {
return stackPtr[--size];
}
int main() {
Stack<int> s;
int i = 0;
for (i=0; i < DEFAULT_SIZE; i++) {
s.push(rand() % 100 +1);
}
for (i=0; i < DEFAULT_SIZE; i++) {
cout << s.pop() << " , ";
if (i % 20 == 0) {
cout << endl;
}
}
}
In Bezug auf die erste Frage, haben Sie eine bessere Zeit mit dem Problem, wenn Sie eine [mcve] machen. Es gibt viele Dinge im aktuellen Code, die für das Problem irrelevant sind. In Bezug auf die zweite Frage, lesen Sie einige Dokumentation für 'Rand'. – chris
Sie sind verrückt nach der "Reallocate wenn voll" -Code eher schlecht, zwei Bugs dort. Ist std :: stack noch so attraktiv? Bleib dran, du wirst es irgendwann bekommen. –