您的位置:首页 > 理论基础 > 计算机网络

关于内存问题提醒!结构体+protobuf做协议体发送!

2016-06-12 19:28 330 查看
内存的三种分配方式:
1. 从静态存储区分配:此时的内存在程序编译的时候已经分配好,并且在程序的整个运行期间都存在。全局变量,static变量等在此存储。
2. 在栈区分配:相关代码执行时创建,执行结束时被自动释放。局部变量在此存储。栈内存分配运算内置于处理器的指令集中,效率高,但容量有限。
3. 在堆区分配:动态分配内存。用new/malloc时开辟,delete/free时释放。生存期由用户指定,灵活。但有内存泄露等问题。
为什么会说这个东西,平时没有感觉,但是最近做制定通信协议时,一时没有考虑清楚,然后不断测试显示错误。通过内存查看,发现他们是不同的存储模块,发送时,只是把栈上的数据发送成功,堆上的数据全部回收了。
具体例子如下:
struct test{
UINT16 cmd;
UINT16 uDataLength;
char* pData;
test(int nLen)
{
pData = new char(nLen);
cmd = 1;
uDataLength = sizeof(test) + nLen;
}
void SetData(const char* pBuf)
{
memcpy(pData, pBuf, strlen(pBuf);
}
}创建的时候我用的是栈test obj, 然后传入堆上面的数据,本地使用是没有问题的,但是tcp传送后,就只能解析到头cmd和数据长度,具体数据全部感觉丢失了,但是这个问题,tcp内网又不会出现丢数据问题,所以还是自己程序问题,然后就开始查看内存分配,突然间就想到一个问题,这个东西不是同一个东西,不是连续的空间,数据发送时,堆上的数据就已经随着堆得回收全部回收了。所以呢。我的主要目的是什么呢:我的主要应用是想用结构体的字节头来获取后面协议的cmd和datalength所以,我需要全部自己序列化,要不就是全部在同一个连续内存中。
具体就是全部在堆上如何表现: 我有一个结构体头,还有一个协议体protobuf,所以需要创建一个连续内存,比如说char* pData = new char(100);
然后就是先把结构体头memcpy到pData中,然后连续copyprotobuf到pData中。最后发出pData即可!
写此文,重点提醒一下自己!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存 tcp struct