MultipleStack
是一个支持多个堆栈的类,但是将它们的所有值存储在一个一维数组中。 push(item, k)
将item
推送到k
堆栈。为了正确执行此操作,该类存储一个数组top
,用于存储每个堆栈中最顶层元素的索引。推送push
后,top[k - 1]
应该将item
增加1,以便正确推送以下项目。但是,有时,push
会将top[k - 1]
增加2,我无法弄清楚原因。
#include <cassert>
class MultipleStack {
int * _s;
size_t * _top;
size_t _nStacks, _size;
public:
MultipleStack(size_t nStacks, size_t size) {
_nStacks = nStacks;
_size = size * nStacks;
_s = new int[size];
_top = new size_t[nStacks];
//Simply sets top = {0, 10, 20, ...} no error here
for (size_t i = 0; i < nStacks; i++) {
_top[i] = (_size / _nStacks) * i;
}
}
//This is the buggy method
void push(int item, size_t k) {
size_t beforeSet = _top[k - 1];
_s[_top[k - 1]] = item;
size_t afterSet = _top[k - 1];
assert(beforeSet == afterSet); // Fails when beforeSet = 14
_top[k - 1] = _top[k - 1] + 1;
}
static void testImplementation() {
//Both, nStacks and size, must be >= 9
int nStacks = 10;
int size = 10;
MultipleStack ms(nStacks, size);
for (int i = 1; i <= nStacks; i++) {
for (int j = 0; j < size; j++) {
ms.push(1, i);
}
}
}
};
int main(int argc, const char * argv[]) {
MultipleStack::testImplementation();
return 0;
}
我为冗长的代码示例道歉。我尽可能地剥离了,但我无法再进一步。
答案 0 :(得分:2)
我在c-tor中看到这行中的一个错误:
size * nStacks
如果我理解正确,_s代表所有堆栈的内存块,所以它的大小应该是:_top
。这可能导致在分配的内存之外写入,这会覆盖后续数据(_s
数组是其中一个数据)。修复size
分配,你应该做得很好。
下次尝试以更谨慎的方式命名变量,这样就不会轻易地误导_size
和_size
。如果您重命名_sizeOfAllStacks
- &gt;这不会是一个问题{{1}}或类似的东西。