gpt4 book ai didi

c++ - 程序因 realloc 而崩溃

转载 作者:太空狗 更新时间:2023-10-29 23:50:12 25 4
gpt4 key购买 nike

我正在尝试构建一个可自行调整大小的堆栈,但 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 以便能够将其重新用于 pop):

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() 在 C++ 中是个坏主意的人都是 100% 正确的。比 malloc()free() 更喜欢 newdelete 并且比你自己的自制堆栈更喜欢标准库容器实现。

无论如何,这里真正的问题是,realloc() 可能会分配一个新的内存块并释放旧的。它返回指向新指针的指针。

正确的调用是:

*st = realloc(*st, sizeof(int) * (*length));

现在 *st 将存储新指针,一切正常。

考虑使用标准库,而不是实现您自己的基本数据结构。它有一个精心设计的界面,并且经过了非常彻底的测试。

关于c++ - 程序因 realloc 而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33022207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com