2013-01-08 27 views
0

我收到运行时错误被释放的指针未被分配 - 如何调试?

malloc: *** error for object 0x10070c5c0: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 

以下堆栈跟踪:

enter image description here

这告诉我,不顺心的事在析构函数~Clustering~NodeMap(第一个是空的第二个调用delete[]),但不是“正在释放的指针”所在的位置。我怎样才能找到这个?

另外,在哪里是malloc_error_break

+3

在valgrind或任何此类内存泄漏/损坏检测工具下运行它。 –

+2

阅读“[三条法则](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-ree)”。 –

+1

“*这告诉我在析构函数'〜Clustering'和'〜NodeMap'(它们是空的存根)*”中出错了。我不认为他们都是空的。我很确定'〜NodeMap()'调用'delete []'。 –

回答

2

这告诉我,不顺心的事在析构函数~Clustering~NodeMap(第一个是一个空存根,第二个叫delete[]),而不是其中的“指针被释放”的说法。

只因为~Clustering是“一个空的存根”并不意味着它不会做任何事情。在执行析构函数的主体之后,析构函数为每个直接的非变量非静态数据成员调用析构函数。显然你的班级Clustering包含一个NodeMap<long,long>类型的数据成员。

我该如何发现这一点?

您的类NodeMap<long,long>包含多少个分配的数组?如果只有一个,那就是那个。如果有多个,请在~NodeMap中设置一个断点,以便逐步执行。

+0

'集群'从'NodeMap'派生。数组确实是错误的来源,我相信我必须实现一个正确的拷贝构造函数来解决这个问题。 – clstaudt

3

你有复制构造函数复制分配的内存吗?如果没有复制构造函数,或者它没有复制已分配的内存,则两个对象的析构函数试图释放相同的内存位置。

+0

我没有复制构造函数。这似乎是潜在的问题。 – clstaudt

相关问题