Я пытался изменить структуру 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
в теме.