Сбой программы при назначении индекса массива - PullRequest
0 голосов
/ 01 февраля 2012

У меня тут небольшая проблема. Каждый раз, когда я запускаю приведенный ниже код, моя программа просто падает.

void Wingcod::push(byte b)
{
    stack[stackp] = b;
    stackp++;
    if(stackp >= stacks)
    {
        stacks += 16;
        try
        {
            realloc(stack,stacks);
        }catch(bad_alloc*)
        {
            cerr << "STACK OVERFLOW";
            exit(1);
        }
    }
}

А стек, стек и стеки определяются следующим образом:

stacks = 8;
stackp = 0;
stack = new byte[stacks];

А байт это просто unsigned char.

Ответы [ 4 ]

6 голосов
/ 01 февраля 2012

Вы не можете использовать realloc() для указателя, который был выделен с помощью new.

Возможно, попробуйте что-то вроде следующего вместо realloc():

        byte* tmp = new byte[stacks];
        delete [] stack;
        stack = tmp;
4 голосов
/ 01 февраля 2012

Вы не можете использовать указатель, выделенный с new T[n] в качестве аргумента для realloc(). Указатели, работающие с realloc(), должны быть из семейства функций malloc() (malloc(), calloc() или realloc()). Лично я не стал бы использовать это, а использовал бы std::vector<T>.

4 голосов
/ 01 февраля 2012

realloc не вызывает исключений, поскольку не относится к new, а к C malloc.Он также не устанавливает указатель.

stacks = 8;
stackp = 0;
stack = static_cast<byte*>(malloc(stacks * sizeof(byte)));

void Wingcod::push(byte b)
{
    stack[stackp] = b;
    stackp++;
    if(stackp >= stacks)
    {
        stacks += 16;
        if(!(stack = static_cast<byte*>(realloc(stack,stacks * sizeof(byte))))) {
            cerr << "STACK OVERFLOW";
            exit(1);
        }
    }
}
0 голосов
/ 01 февраля 2012

С здесь , Realloc работает только с указателем на память, ранее назначенную alloc. Попробуйте использовать malloc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...