Warning:control reaches end of non-void function

Программа работает с переменным успехом,выдает такие ошибки как "Недостаточно места в куче" или предупреждение Warning:control teaches end of non-void function( в методе перегрузки оператора [ ]).

Задача такова:нужно написать стек на основе односвязного списка,реальзовать функции pop() и push(),создать глобальную функцию,которая разбивает число на простые множетели и хранит их в стеке и потом мы выводим их на консоль.

#include<iostream>
#include <iomanip>
using namespace std;

template<class INF, class FRIEND>
class ListNode // узел(элемент)
{
private:
    INF data; //данные
    ListNode * pnext; //указатель на след элемент односвязного списка
    ListNode() //реализация конструктора
    {
        data = 0;
        pnext = nullptr;
    }
    ~ListNode()//деструктор
    {
        delete[] pnext;
    } 
    friend FRIEND;
};

template<class INF>
class Stack
{
private:
    typedef class ListNode < INF, Stack <INF> > Node;//класс Stack это дружественный класс к кдассу ListNode. Node это новое имя(для удобства)
    Node *head;// указатель на первый элемент
    int size; // размер стека

public:
    Stack();// конструктор
    //Stack(Stack& other);
    ~Stack(); //деструктор
    void clear();// очистить стек
    void push(INF obj); // поместить элемент в стек
    void pop();// удалить элемент из стека
    //void printStack(); //функция печати стека
    INF & operator[](const int index);
    int GetSize()
    { 
        return size; 
    }
};

template<class INF>
inline Stack<INF>::Stack()
{
    head = nullptr;
    size = 0;
}


template<class INF>
inline Stack<INF>::~Stack()
{
    clear();
}

template<class INF>
inline void Stack<INF>::clear()
{
    while (size)// пока в списке есть элементы мы будем удалять первый элемент списка
    {
        pop();
    }
}

template<class INF>
void Stack<INF>::push(INF obj)
{
    Node *temp = new Node;
    temp->data = obj;// заносим данные во временную переменную
    if (head == nullptr)// проверка есть ли в стеке первый элемент
        temp->pnext = nullptr;//если нет то делаем временную переменную которая указвает на след элемент стека null
    else
        temp->pnext = head;// если есть то делаемэту временуую переменную указвающую на след элемент головой
    head = temp;
    size++;

}

template<class INF>
void Stack<INF>::pop()
{
    Node *temp = head;// временный объект который хранит первый элеиент
    head = head->pnext;// хранит адрес след элемента после первого(после head)
    delete temp;// удаляем бывший первый элемент
    size--;
}

template<class INF>
inline INF & Stack<INF>::operator[](const int index)
{
    int counter = 0;

    Node *current = this->head;

    while (current != nullptr)
    {
        if (counter == index)
        {
            return current->data;
        }
        current = current->pnext;
        counter++;
    }

}


void Multipliers(int n, Stack <int> &stack)//(число,которое нужно разбить на мнж,простые множители)
{
    system("chcp 1251 > null");

    int div = 2;
    cout << "Введите число" << endl;
    while (n > 1)
    {
        while (n % div == 0)
        {
            //cout << "*" << endl;
            stack.push(div);
            n = n / div;
        }
        div++;
    }
}

int main()
{
    system("chcp 1251 > null");

    int n = 245;
    Stack <int> s;
    Multipliers(n, s);

    for (int i = 0; i < s.GetSize(); i++)
    {
        cout << s[i]  << endl;

    }

    system("pause");
    return 0;
}

Ответы (1 шт):

Автор решения: AlexGlebe

Деструктор ListNode - удаляет следующий элемент, думая, что это его личный массив.

~ListNode()//деструктор
    {
        delete[] pnext; // ошибка
    }

Не трогайте указатель, Сам список Stack всё удалит.

~ListNode()//деструктор
    {
    }
→ Ссылка