我正在尝试构建一个可以自动调整大小的堆栈,但是使用realloc()
时程序崩溃了。
构造器:
Stack::Stack()
{
st = (int*)malloc(sizeof(int));
sp = 0;
length = 1;
}
这是我的
add()
函数:void Stack::add(int item)
{
if (sp == length)
Stack::resizeStack(&st, &length, 1);
st[sp++] = item;
}
调整大小功能(我使用变量a以便能够重复使用它进行弹出):
void Stack::resizeStack(int **st, int *length, bool a)
{
if (a == 1)
*length *= 2;
else
*length /= 2;
realloc(*st, sizeof(int) * (*length));
}
这是我测试栈的方法:
Stack* myStack = new Stack();
for (int i = 0; i < 10; i += 1) {
myStack->add(i);
cout << myStack->getStackSize() << '\n';
}
free(myStack);
我注意到程序在 for
结束时崩溃了。
如果有人能解释一下我做错了什么,我会很感激。
malloc
、free
和realloc
?(原文已翻译) - PaulMcKenziefree
释放通过new
分配的内存,但是你一开始就不需要使用new
。 - emlainew
和free
。Stack *myStack = new Stack(); ... free(myStack);
这是未定义的行为。看起来您正在从C书籍和/或教程中学习C ++。 - PaulMcKenziethis->length
和this->st
。然后您可以删除一些星号。此外,为什么要缩小尺寸。通常,动态数组只会增长,但它可能有一个 shrink_to_fit 方法,可以手动调用。 - user877329