我试图将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函数似乎抛出了错误。
非常感谢任何帮助。
答案 0 :(得分:1)
在main
的最后一行中,您使用指向具有自动存储持续时间的对象的指针调用setNextLink
(z
保存y
的地址)。您的列表在销毁时会尝试删除该指针,因此错误(y
尚未动态分配,因此无法动态删除)。
答案 1 :(得分:1)
您正在给setNextLink
指向自动分配的变量的指针
x.setNextLink(z); // z points to automatic object y
您尝试在构造函数中删除的。
~chainLink() {
delete nextLink; // attempts to delete automatic object y
}
您需要将指针传递给动态分配的对象,或者让自己的对象进入chainLink
类。
注意:在C ++中,struct
和class
es是相同的栏some differences。可以使用两者中的任何一种来实现等效类型。
答案 2 :(得分:0)
行x.setNextLink(z);
x.nextLink
指向z
后,y
指向y
。但delete
是本地对象。它分配在堆栈而不是堆。因此,在其上调用{{1}}是违法的。