2021SC@SDUSC
目录
一.前置知识点
二.关键代码分析
一.前置知识点 1.malloc()函数:动态分配内存空间
malloc()函数是在stdlib.h库里的一个函数。malloc() 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。
如果希望在分配内存的同时进行初始化,可以使用 calloc() 函数的~
malloc()函数的返回值是:分配成功返回指向该内存的地址,失败则返回 NULL。
malloc()函数的返回值类型是 void *,void 并不是说没有返回值或者返回空指针,而是返回的指针类型未知。
二.关键代码分析int TutorialMessage::set_message_body(const void *body, size_t size)
{
void *p = malloc(size);
if (!p)
return -1;
memcpy(p, body, size);
free(this->body);
this->body = (char *)p;
this->body_size = size;
this->head_received = 4;
this->body_received = size;
return 0;
}
//1.memcpy函数使得body中的size个字节复制给p;
2.释放掉this指向body之前的值,从现在开始,this指向body的值是(char *)p,大小为size;this指向head_received的值为4,指向body_received的值为size。
TutorialMessage::TutorialMessage(TutorialMessage&& msg)
{
//msg是一个字符串
*(ProtocolMessage *)this = std::move(msg);
memcpy(this->head, msg.head, 4);
this->head_received = msg.head_received;
this->body = msg.body;
this->body_received = msg.body_received;
this->body_size = msg.body_size;
msg.head_received = 0;
msg.body = NULL;
msg.body_size = 0;
}
//1.memcpy函数使得msg.head中的4字节长度的值复制给this->head。首先先保证读取4字节的head完整,再读取body。因此是先使 msg.head_received的值赋给this->head_received;再使 msg.body的值赋给this->body。
读取完成后使msg.head_received,msg.body_size归零,msg.body为空。
TutorialMessage& TutorialMessage::operator = (TutorialMessage&& msg)
{
if (&msg != this)
{
this->size_limit = msg.size_limit;
msg.size_limit = (size_t)-1;
memcpy(this->head, msg.head, 4);
this->head_received = msg.head_received;
this->body = msg.body;
this->body_received = msg.body_received;
this->body_size = msg.body_size;
msg.head_received = 0;
msg.body = NULL;
msg.body_size = 0;
}
return *this;
}
//如果this不指向msg的地址,那就使this->size_limit指向msg.size_limit后,msg.size_limit减少一位,重复TutorialMessage::TutorialMessage(TutorialMessage&& msg)中的实现。
}
---------------------------------------------------------------------------------------------------------------------------------
参考资料:
tutorial/tutorial-10-user_defined_protocol/message.cc · 搜狗开源/workflow - Gitee.com
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)