Освобожденный указатель не был выделен для назначения указателя

Я пытался изменить структуру ListNode в формате класса, но сталкиваюсь с некоторыми проблемами при тестировании.

Получение a.out (7016) malloc: * ошибка для объекта 0x7fff65333b10: освобожденный указатель не был выделен * установить точку останова в malloc_error_break для отладки

chainLink.hpp 
#ifndef CHAINLINK_H
#define CHAINLINK_H

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

template <typename Object>

class chainLink
{
    private:
        Object storedValue;
        chainLink *nextLink;
    public:
            //Constructor
        chainLink(const Object &value = Object()): storedValue(value)
        {
            nextLink = NULL;
        }
        /* Postcondition:   returns storedValue;
         */     
        Object getValue()
        {
            return storedValue;
        }

        /* Postcondition:   sets storedValue = value
         */
        void setValue(Object &value)
        {
            storedValue = value;
        }

        /* Postcondition:   sets nextLink to &value
         */
        void setNextLink(chainLink* next)
        {
            nextLink = next;
        }

        chainLink* getNext()
        {
            return nextLink;
        }
        ~chainLink()
        {
            delete nextLink;
        }
};
#endif

Мой тестовый файл, предположим, включает в себя

int main()
{
    chainLink<int> x(1);
    cout << "X: " << x.getValue() << " "<< endl;
    chainLink<int> y(2);
    cout << "Y: " << y.getValue() << " "<< endl;
    chainLink<int>* z = &y;
    cout << &y << " " << z << endl;
    x.setNextLink(z);
}

ВЫХОД: X: 1 Y: 2 0x7fff65333b10 0x7fff65333b10 a.out (7016) malloc: * ошибка для объекта 0x7fff65333b10: освобожденный указатель не был выделен * установить точку останова в malloc_error_break для отладки Прерывание прерывания: 6

Кажется, ошибка генерируется функцией setNextLink.

Любая помощь с благодарностью.

3 ответа

Решение

Вы даете setNextLink указатель на автоматически размещаемую переменную,

x.setNextLink(z); // z points to automatic object y

которую вы пытаетесь удалить в конструкторе.

~chainLink() {
    delete nextLink; // attempts to delete automatic object y
}

Вам нужно передать указатель на динамически размещенный объект или сделать свой собственный chainLink учебный класс.

Примечание: в C++ structс и classЭто одна и та же полоса с некоторыми отличиями. Эквивалентные типы могут быть реализованы с использованием любого из двух.

В последней строке main ты звонишь setNextLink с указателем на объект с автоматической продолжительностью хранения (z содержит адрес y). Ваш список пытается удалить этот указатель, когда он уничтожен, следовательно, ошибка (y не был выделен динамически, и, следовательно, не может быть удален динамически).

После линии x.setNextLink(z);x.nextLink указывает на zкоторый, в свою очередь, указывает на y, Но y это локальный объект. Он размещается в стеке, а не в куче. Так что незаконно звонить delete в теме.

Другие вопросы по тегам