类破坏时内存损坏(双重免费)

时间:2015-01-29 15:50:03

标签: c++ destructor free

有人请解释一下这个案例:为什么我在这个简单的代码中遇到“双重免费”问题?

void Rreceive (myclass){}

int main () {
    myclass msg (1);
    Rreceive(msg);
    return 0;
}

其中myclass是:

class myclass
{
    private:
        HeaderType header;
        byte * text;    

    public:
        myclass(int ID);
        ~myclass();
        HeaderType getHeader();
        byte * getText();
};

myclass::myclass(int ID){
    header.mID = ID;
    text = (byte *)malloc (10);
    memset (text, '.', 10);
}

myclass::~myclass(){
    free (text);
}

HeaderType myclass::getHeader(){
    return header;
}

byte * myclass::getText(){
    return text;
}

和HeaderType为:

typedef struct {
    int mID;
}HeaderType;

错误是:*** glibc detected *** ./test: double free or corruption (fasttop): 0x0868f008 ***...

1 个答案:

答案 0 :(得分:5)

当您输入Rreceive函数时,您将调用默认的复制构造函数,它不会复制文本指针(换句话说,他只会将指针指定给新副本)。

当退出Rreceive范围时,您从复制的实例中释放(文本),这将指向相同的内存地址。

退出主要功能范围时,您将尝试再次释放相同的内存地址。