realloc (): неверный старый размер, даже когда malloc () используется для выделения памяти - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь реализовать динамический стек в c ++.у меня есть 3 члена в стеке класса 1.cap это емкость.2.top - указывает на вершину стека. 3. arr - указатель на целое число.

в классе constrcutor Я выделяю память для стека (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.push\n                    2.pop\n" << endl;
        cin >> choice;

        switch (choice)
        {
        case 1: cout << "Enter data?" << endl;
            cin >> x;
            check = s.push(x);
            cout << (check ? "              push complete\n" : "              push failed\n");
            break;

        case 2: check = s.pop();
            cout << (check ? "              pop complete\n" : "               pop failed\n");
            break;

        default: cout << "ERROR";
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Чтобы добавить к ответу Джона,

то, как вы используете 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;.

Правильный тм способ использования realloc():

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

Кроме того, где этоваш copy-ctor, оператор присваивания и d-tor?

0 голосов
/ 27 февраля 2019

Функция full неверна.Это должно быть

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

или более просто и с добавлением const

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

Также вы неправильно используете переменную top.Поскольку top начинается с -1, вам следует увеличивать top до того, как вы установите значение, а не после

arr[++top] = x;

Не ошибка, но с точки зрения дизайна meminc должна быть частной функцией.

...