class 破坏时的内存损坏(双重释放)
Memory corruption (double free) on class destruction
谁能解释一下这个案例:为什么我在这个简单的代码中遇到 'double 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 ***...
当您输入 Rreceive 函数时,您会调用默认的复制构造函数,它不会对您的文本指针进行深度复制(换句话说,他只会将指针分配给新副本)。
退出 Rreceive 范围时,您从复制的实例中释放 (text),它将指向相同的内存地址。
您将在退出 main 函数的范围时再次尝试释放相同的内存地址。
谁能解释一下这个案例:为什么我在这个简单的代码中遇到 'double 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 ***...
当您输入 Rreceive 函数时,您会调用默认的复制构造函数,它不会对您的文本指针进行深度复制(换句话说,他只会将指针分配给新副本)。
退出 Rreceive 范围时,您从复制的实例中释放 (text),它将指向相同的内存地址。
您将在退出 main 函数的范围时再次尝试释放相同的内存地址。