Ошибка 0xC0000005

360
09 августа 2017, 20:21

Пишу стек на плюсах. Exeшник компилится и крашится с ошибкой 0xC0000005. Помогите, пожалуйста.

template<class T> struct Stack
{
    Stack()          : LAST(int()) {}
    Stack(int ssize) : LAST(ssize) { DATA = new T [ssize]; }
    Stack push(T n)
    {
        LAST++;
        realloc(DATA, LAST*sizeof(T));
        DATA[LAST - 1] = n;
        return *this;
    }
    Stack pop()
    {
        LAST--;
        realloc(DATA, LAST*sizeof(T));
        return *this;
    }
    T top()
    {
        return DATA[LAST - 1];
    }
    T *DATA;
    int LAST;
};
int main()
{
    Stack<int> st;
    st.push(10);
    st.push(20);
    st.pop();
    int a = st.top();
    return 0;
}
Answer 1

Основная проблема заключается в неверном использовании функции realloc. Из обнаруженных ошибок:

    • У вас при первом вызове метода push эта функция получает неинициализованный указатель. Следует обнулить поле data.
    • Первый аргумент этой функции должен быть указателем, полученным от malloc или realloc.
  1. Возвращаемое значение realloc можно проверять на NULL, а кроме того, надо обязательно присваивать полю data. Потому что, если функция переместит массив в другое место памяти, она вернёт новый указатель на него.

По поводу последнего пункта компилятор GCC даже выдаёт предупреждение

t.cpp: In member function ‘Stack<T> Stack<T>::push(T) [with T = int]’:
t.cpp:11:9: warning: ignoring return value of ‘void* realloc(void*, size_t)’, declared with attribute warn_unused_result [-Wunused-result]
         realloc(DATA, LAST*sizeof(T));
         ^

P.S.: пожалуйста, имена целиком из заглавных букв давайте только константам.

READ ALSO
Аналог Object.Equals на C++?

Аналог Object.Equals на C++?

Нужно сравнить два объекта в шаблонном методеВ C# я бы написал:

371
Проблемы с библиотекой (arduino)

Проблемы с библиотекой (arduino)

Есть библиотека: DynamicCollectionh DynamicCollection

280
Boost::asio потеря пакетов по TCP

Boost::asio потеря пакетов по TCP

Имеется клиент-серверное приложениеСервер передает сообщения клиенту, число отправленных сообщений фиксируется

349
Gstreamer c++ ошибка &#39;G_IS_OBJECT (object)&#39; failed

Gstreamer c++ ошибка 'G_IS_OBJECT (object)' failed

Есть батник принимающий видео трансляцию по RTP средствами gstreamerПытаюсь написать программу, которая делал бы тоже самое, что бы не было нужды...

345