没有为指针赋值分配被释放的指针

时间:2012-09-04 06:30:50

标签: c++ pointers new-operator

我试图将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函数似乎抛出了错误。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

main的最后一行中,您使用指向具有自动存储持续时间的对象的指针调用setNextLinkz保存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 ++中,structclass es是相同的栏some differences。可以使用两者中的任何一种来实现等效类型。

答案 2 :(得分:0)

x.setNextLink(z); x.nextLink指向z后,y指向y。但delete本地对象。它分配在堆栈而不是堆。因此,在其上调用{{1}}是违法的。