Reputation: 55
I was trying to change a ListNode struct into a class format but am running into some issues when testing it.
Getting a.out(7016) malloc: * error for object 0x7fff65333b10: pointer being freed was not allocated * set a breakpoint in malloc_error_break to debug
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
My test file, assume includes
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);
}
OUTPUT: X: 1 Y: 2 0x7fff65333b10 0x7fff65333b10 a.out(7016) malloc: * error for object 0x7fff65333b10: pointer being freed was not allocated * set a breakpoint in malloc_error_break to debug Abort trap: 6
The error seems to be thrown by the setNextLink function.
Any help greatly appreciated.
Upvotes: 3
Views: 9537
Reputation: 227418
You are giving setNextLink
a pointer to an automatically allocated variable,
x.setNextLink(z); // z points to automatic object y
which you attempt to delete in the constructor.
~chainLink() {
delete nextLink; // attempts to delete automatic object y
}
You need to pass a pointer to a dynamically allocated object, or make your own insde your chainLink
class.
Note: In C++, struct
s and class
es are the same bar some differences. A equivalent types can be implemented using either of the two.
Upvotes: 1
Reputation: 2990
After the line x.setNextLink(z);
x.nextLink
points to z
, which in turn is pointing to y
. But y
is a local object. It is allocated on stack and not the heap. So it is illegal to call delete
on it.
Upvotes: 0
Reputation: 76808
In the last line of main
you are calling setNextLink
with a pointer to an object with automatic storage duration (z
holds the address of y
). Your list tries to delete that pointer when it is destroyed, hence the error (y
has not been allocated dynamically, and hence cannot be deleted dynamically).
Upvotes: 1