Realloc():即使使用malloc()分配内存,旧大小也无效

realloc(): invalid old size even when malloc() is used to allocate memory

本文关键字:无效 malloc Realloc 分配 内存      更新时间:2023-10-16

我正在尝试在C 中实现动态堆栈。我在课堂堆里有3个成员1.CAP是容量。2.标准点到堆栈顶部3.到达整数。

在类约束中,我将存储器分配给堆栈(malloc)。稍后,在Meminc()我试图实现内存。

我已经写了一个函数meminc()来实现内存,但我遇到了这个无效的旧尺寸错误。

,如果您让我知道此代码中有什么问题,这将是有帮助的。我也将感谢任何给我的建议。谢谢。

#include <iostream>
using namespace std;
#define MAXSIZE 5
class stack {
    int cap;
    int top;
    int *arr;
public:
    stack();
    bool push(int x);
    bool full();
    bool pop();
    bool empty();
    bool meminc();
};
stack::stack()
{
    cap = MAXSIZE;
    arr = (int *)malloc(sizeof(int)*MAXSIZE);
    top = -1;
}
bool stack::meminc()
{
    cap = 2 * cap;
    cout << cap << endl;
    this->arr = (int *)realloc(arr, sizeof(int)*cap);
    return(arr ? true : false);
}
bool stack::push(int x)
{
    if (full())
    {
        bool x = meminc();
        if (x)
            cout << "Memory increased" << endl;
        else
            return false;
    }
    arr[top++] = x;
    return true;
}
bool stack::full()
{
    return(top == MAXSIZE - 1 ? true : false);
}
bool stack::pop()
{
    if (empty())
        return false;
    else
    {
        top--;
        return true;
    }
}
bool stack::empty()
{
    return(top == -1 ? true : false);
}
int main()
{
    stack s;
    char y = 'y';
    int choice, x;
    bool check;
    while (y == 'y' || y == 'Y')
    {
        cout << "                 1.pushn                    2.popn" << endl;
        cin >> choice;
        switch (choice)
        {
        case 1: cout << "Enter data?" << endl;
            cin >> x;
            check = s.push(x);
            cout << (check ? "              push completen" : "              push failedn");
            break;
        case 2: check = s.pop();
            cout << (check ? "              pop completen" : "               pop failedn");
            break;
        default: cout << "ERROR";
        }
    }
}

要添加约翰的答案,

您使用realloc()的方式是...

bool stack::meminc()
{
    cap = 2 * cap;
    cout << cap << endl;
    this->arr = (int *)realloc(arr, sizeof(int)*cap);
    return(arr ? true : false);
}

如果realloc()失败,它将返回nullptr,并且将唯一的指针(arr)返回到原始内存区域。另外,代替return(arr ? true : false);,您应该简单地使用return arr != nullptr;

tm 使用realloc()

bool stack::meminc()
{
    int *temp = (int*) realloc(arr, sizeof(*temp) * cap * 2);
    if(!temp)
        return false;
    cap *= 2;
    arr = temp;
    return true;
}

另外,您的复印件,作业运算符和D-tor?

在哪里

full函数不正确。应该是

bool stack::full()
{
    return(top == cap - 1 ? true : false);
}

或更简单的添加const

bool stack::full() const
{
    return top == cap - 1;
}

您也错误地使用了top变量。由于顶部从-1开始,您应该在设置值之前增加top,而不是之后

arr[++top] = x;

不是一个错误,而是从设计中的 meminc是私人功能。