c++ - 类破坏时的内存损坏(双重释放)

标签 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 检测到 *** ./test: 双重释放或损坏 (fasttop): 0x0868f008 ***...

最佳答案

当您进入 Rreceive 函数时,您将调用默认的复制构造函数,该构造函数不会对文本指针进行深层复制(换句话说,他只会将指针分配给新拷贝)。

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

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

关于c++ - 类破坏时的内存损坏(双重释放),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28218886/

相关文章:

c - C 会自动释放函数内分配的内存吗?

c++ - 调试客户机器上生成的核心文件

C++ - 何时为使用但未分配的对象调用析构函数?

C# 类 : Do logging/housekeeping, 我应该使用析构函数吗?

C++ 构造函数/析构函数继承

c - C 中的内存管理问题

c - 释放函数本地指针并返回该指针

c++ - 试图在我的学校学生服务器上编译这个 C++ 文件

c++ - Boost 序列化和 MFC : "cannot open file ' libboost_serialization-vc141-mt-s-x32-1_69. lib'"

C++14 regex_search 0 匹配