被释放的指针并未分配给指针赋值。

3

我试图将一个ListNode结构转换为类格式,但在测试时遇到了一些问题。

获取a.out(7016)的malloc: *出现错误,对象0x7fff65333b10的指针被释放,但未分配设置中断点以调试。

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: * error for object 0x7fff65333b10: pointer being freed was not allocated * set a breakpoint in malloc_error_break to debug Abort trap: 6

错误似乎是由setNextLink函数引起的。

非常感谢您提供的任何帮助。


4
如果你尝试阅读并理解错误信息所告诉你的内容会很有帮助:“释放的指针未被分配”。这可能意味着你忘记分配某些东西,比如说某个位置的new操作。每个delete调用都必须在某个地方先有一个new调用(可能是在代码外部)。 - In silico
你是通过调用new函数得到了z指针吗? - Mat
不是非常相关,但是你所说的“将某物从结构体转换为类格式”是什么意思? - jalf
1
@Hindol“另外,通常方法名称以大写字母开头。”不是这样的。 - juanchopanza
@juanchopanza 至少在 设计模式现代C++设计 中是这样的。我认为这很普遍。 - Hindol
显示剩余2条评论
3个回答

1
main的最后一行,您使用自动存储期指针(z保存了y的地址)调用了setNextLink方法。当列表被销毁时,尝试删除该指针,因此出现错误(y并未以动态方式分配内存,因此无法动态删除)。

1

您正在将指针传递给自动分配的变量 setNextLink

x.setNextLink(z); // z points to automatic object y

你试图在构造函数中删除它。

~chainLink() {
    delete nextLink; // attempts to delete automatic object y
}

您需要传递一个指向动态分配对象的指针,或在您的chainLink类内部创建自己的对象。

注意:在C++中,structclass是相同的,除了一些差异。等效类型可以使用其中任何一个实现。


0
在代码行 x.setNextLink(z); 之后,x.nextLink 指向 z,而 z 又指向 y。但是,y 是一个局部对象。它被分配在堆栈上而不是堆上。因此,在其上调用 delete 是非法的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接