stack — malloc (): ошибка повреждения памяти (быстрая) Переполнение стека

Я работаю в C ++. Я работаю над методом изменения максимальной емкости стека, и меня смущает ошибка, которую я получаю. Ниже мой метод.

void Stack::setCapacity(unsigned newCapacity){
if(newCapacity< this->getSize()){
throw StackException("setCapacity()",
"the size is larger than the desired capacity");
} else {
if(newCapacity != myCapacity){
Item * tempArray = new Item[newCapacity];
if(newCapacity < myCapacity){
for(unsigned i=0; i<newCapacity;i++){
tempArray[i] = myArray[i];
}
} else if (newCapacity > myCapacity) {
for(unsigned i=0; i<myCapacity; i++){
tempArray[i] = myArray[i];
}
}
for(unsigned i=0; i<newCapacity; i++){
myArray[i] = tempArray[i];
}
delete tempArray;
}
myCapacity = newCapacity;
}
}

Я также написал тестовый метод, чтобы проверить, что мой метод setCapacity () работает.

void StackTester::setCapacityTest() {
cout << "- setCapacity... " << flush;

// empty stack
Stack st7(5);
assert(st7.getSize() == 0);
assert(st7.getCapacity() == 5);
st7.setCapacity(7);
assert(st7.getCapacity() == 7);
cout << " 1 " << flush;

// partially filled stack - larger capacity
Stack st8(5);
assert(st8.getCapacity() == 5);
st8.push(3);
st8.push(4);
st8.setCapacity(7);
assert(st8.getCapacity() == 7);
assert(st8.getTop() == 4);
st8.pop();
assert(st8.getTop() == 3);
cout << " 2 " << flush;

// size larger than new capacity
try{
Stack st9(3);
st9.push(7);
st9.push(4);
st9.push(11);
assert(st9.getSize() == 3);
st9.setCapacity(2);
cerr << "setCapacity's new capacity is larger than the size";
exit(1);
} catch(StackException& se){
cout << " 3 " << flush;
}

// partially filled stack - smaller capacity
Stack st10(5);
assert(st10.getCapacity() == 5);
st10.push(1);
st10.setCapacity(2);
assert(st10.getCapacity() == 2);
assert(st10.getTop() == 1);
cout << " 4 " << flush;

// fully filled stack - larger capacity
Stack st11(2);
assert(st11.getCapacity() == 2);
st11.push(3);
st11.push(7);
assert(st11.getTop() == 7);
st11.setCapacity(3);
assert(st11.getCapacity() == 3);
cout << " 5 " << flush;

cout << " Passed!" << endl;
}

Когда я запускаю каждый раздел теста по отдельности, комментируя остальные, все работает нормально. Каждый раздел теста проходит. Однако, когда я объединяю разделы и пытаюсь выполнить весь тест, я получаю следующую ошибку:

* Обнаружен glibc ** * /home/…/StackProject: malloc (): повреждение памяти (быстрое): 0x0000000001e86030 *

Используя отладчик, я сузил проблему до создания myArray в стеке. Например, после успешного выполнения «1» в моем тесте создание myArray в st8 (5) в «2» вызывает сбой программы.

Мой основной источник путаницы связан с тем, что каждый раздел проходит индивидуально, но не проходит коллективно. Я не уверен, что с этим делать. Мой метод написан неправильно? Если так, как я должен исправить это?

Спасибо.

1

Решение

Я вижу следующие проблемы в setCapacityв следующем блоке кода:

  if(newCapacity != myCapacity){
Item * tempArray = new Item[newCapacity];
if(newCapacity < myCapacity){
for(unsigned i=0; i<newCapacity;i++){
tempArray[i] = myArray[i];
}
} else if (newCapacity > myCapacity) {
for(unsigned i=0; i<myCapacity; i++){
tempArray[i] = myArray[i];
}
}

// When newCapacity > myCapacity, myArray does not
// have enough space for this loop.
// Say myCapacity = 5 and newCapacity = 7
// Accessing myArray[5] and myArray[6] is a problem.

for(unsigned i=0; i<newCapacity; i++){
myArray[i] = tempArray[i];
}

// You are deleting the newly allocated array, even though you are using
// the wrong delete operator.
// myArray still points to the old allocated memory.
delete tempArray;
}

Что вам нужно это:

  if(newCapacity != myCapacity){
Item * tempArray = new Item[newCapacity];
if(newCapacity < myCapacity){
for(unsigned i=0; i<newCapacity;i++){
tempArray[i] = myArray[i];
}
} else if (newCapacity > myCapacity) {
for(unsigned i=0; i<myCapacity; i++){
tempArray[i] = myArray[i];
}
}

// Need to delete the old array and keep the new array.

Item* oldArray = myArray;
myArray = tempArray;

// Use the array delete operator, not the simple delete operator.
delete [] oldArray;
}
4

Другие решения

У тебя есть

delete tempArray;

Но это массив, поэтому вы должны сделать:

delete [] tempArray;

(хотя я понятия не имею, что делает эта функция или почему …)

5

По вопросам рекламы [email protected]