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