内存问题提醒!结构体+protobuf做协议体发送!序列化

20 篇文章 0 订阅
14 篇文章 0 订阅

内存的三种分配方式:
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即可!

写此文,重点提醒一下自己!

转载自:https://blog.csdn.net/u012307430/article/details/51648419

protobuf序列化指的是用protobuf库将数据结构(如类、结构体、数组、列表等)转换成字节数组的过程。protobuf是一种轻量级的序列化框架,用于数据交换和存储领域。它具有协议缓冲区(Protocol Buffers)的特性,可实现高效的数据序列化和反序列化,支持多种编程语言(如C++、Java、Python等),有着简单、高效、扩展性强的优点,广泛应用于分布式系统、网络通信、数据存储、机器学习等领域。 protobuf序列化的过程包括定义数据结构、编写.proto文件、生成对应编程语言的代码、序列化和反序列化。定义数据结构时,需按protobuf规范定义字段类型和名称,如int、double、string、bool等,还可以定义嵌套类型、枚举类型等。编写.proto文件时,需遵循protobuf规范,指定消息类型、字段名称和编号、数据类型、默认值等信息,可以使用注释、枚举类型、嵌套类型等。生成代码时,需先安装protobuf库,然后用protoc命令编译.proto文件,生成对应编程语言的代码文件,如C++的.pb.h和.pb.cc文件、Java的.proto文件和.java文件等。序列化时,需先创建消息对象、设置字段值、调用SerializeToArray函数将消息对象序列化成字节数组。反序列化时,需先创建消息对象、调用ParseFromArray函数将字节数组反序列化成消息对象、获取字段值。 protobuf序列化具有以下优点:1)高效:protobuf序列化后的字节数组较小,序列化和反序列化效率高,占用的内存较少,可减少网络传输和存储开销;2)扩展性强:protobuf支持版本控制和兼容性,修改数据结构时不需要重写代码,只需修改.proto文件并重新编译即可;3)跨平台性好:protobuf支持多种编程语言,可在不同平台上使用同一套数据结构和代码;4)易维护:protobuf代码结构清晰,可读性好,易于维护和修改。 总之,protobuf序列化是一种高效、可扩展、跨平台、易维护的数据序列化方式,可广泛应用于各种领域的数据交换和存储。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值