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

Я пытался изменить структуру 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это тот же бар некоторые отличия. Эквивалентные типы могут быть реализованы с использованием любого из двух.

1

Другие решения

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

1

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

0