内存问题提醒!结构体+protobuf做协议体发送!序列化
内存的三种分配方式:
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做协议体发送!序列化相关推荐
- C语言内存管理之结构体
内存管理之结构体 数据结构的意义 简单的数据结构-数组 数组的优势和劣势 使用方法和细节 结构体的声明 结构体的高级使用方法 结构体内嵌指针实现面向对象 数据结构的意义 数据结构就是研究数据如何组织( ...
- 【C 语言】结构体 ( 结构体类型定义 | 结构体类型别名 | 声明结构体变量的三种方法 | 栈内存中声明结构体变量 | 定义隐式结构体时声明变量 | 定义普通结构体时声明变量 )
文章目录 一.结构体类型定义 二.结构体类型别名 三.结构体类型变量声明 1.使用结构体类型 ( 别名 ) 声明变量 2. 定义隐式结构体时声明变量 3.定义普通结构体时声明变量 二.完整代码示例 一 ...
- 【零基础学C语言】知识总结八:struct 结构体与 union 共用体
struct 结构体 struct即结构体,C程序中经常需要用相关的不同类型的数据来描述一个数据对象.例如,描述学生的综合信息时,需要使用学生的学号.姓名.性别等不同类型的数据时,像这种数据类型总是在 ...
- 黑马程序员C语言基础(第八天)复合类型(自定义类型)(结构体)、共用体(联合体)、枚举enum、 typedef
黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...
- c语言结构体加联合,C语言:结构体和联合体(共用体)
结构体:struct 1.结构体变量的首地址能够被其最宽基本类型成员的大小所整除. 2.结构体每个成员相对于结构体首地址的偏移量(offset)都是成员的整数倍. 3.结构体的总大小为结构体最宽基本类 ...
- 对C语言 结构指针变量做函数的参数 结构作为函数的参数
一.结构指针变量做函数的参数 /* 用指针变量作函数参数进行传送,这时由实参传向形参的只是地址,从而减少了时间和空间的开销. */ /* 计算一组学生的平均成绩和不及格的人数,用结构指针变量作函数参数 ...
- 转载——C语言中float,double类型,在内存中的结构(存储方式)
最近在做一个数据格式分析和转换的项目,第一次接触底层的二进制代码存储,看的一头雾水,看到这个帖子后对于在Windows系统下数据的存储方式有了更多的了解,将原文分享一下: 原文地址为http://ww ...
- Shared pool内存块组成结构及4031错误原因分析
这篇文章是参考甲骨论老相老师的教学视频所做的学习笔记: http://v.youku.com/v_show/id_XMzkyMDQ4MzUy.html 之前提到Shared pool的作用: Shar ...
- 防止内存泄露 Linux下用Valgrind做检查
Valgrind技术参考 http://valgrind.org/docs/manual/tech-docs.html 防止内存泄露 Linux下用Valgrind做检查 发布时间:2007.10.2 ...
最新文章
- JavaScript 运行机制详解:Event Loop——续
- Azure Bill
- python打包zip文件_python 解压文件,合并文件 打包成zip格式文件 生成MD5值
- SpringAOP aspectJ ProceedingJoinPoint 获取当前方法
- mongo快速翻页方法(转载)
- 三维旋转矩阵_线性代数的本质(4)--矩阵乘法与复合变换
- 一个比较完整的pytorch项目
- postman访问abp接口因cookies问题导致400错误
- 庖丁解牛之spring源码系列一
- 基于PHP的超市库存管理系统
- mac系统我的世界服务器,我的世界Mac版怎么联机?
- php怎么在excel表格中输出换行,Excel表格怎么换行打字
- unity交通仿真_自动驾驶仿真该怎么玩
- 英雄无敌服务器维护,英雄无敌王国服务器地图攻略
- Unity3D网络游戏0.2
- Bootstrap3基础 table-striped 表格实现隔行换色(浅灰色与白色交替)
- PHP前一页 后一页 切换
- DataBinding找不到符号,import xxx.xxx.ActivityxxxBindingImpl
- 【读书笔记】《数学之美》——一个好方法在形式上总是简单的
- JavaScript提升(你不知道的JavaScript)
热门文章
- php多线程模拟请求,浅谈php使用curl模拟多线程发送请求
- 计算机专业英语霍洪涛出版社,计算机专业英语(霍洪涛)课件Chapter 4.ppt
- 日期时间格式之间的相互转换
- html中购物车总金怎么算额,计算购物车金额总和( jquery )
- 学习笔记16-C语言-小项目-使用Makefile完成2048
- 【精品计划 附录2】- 算法分析
- centos网络隔一段时间就断_计算机网络总结
- 密码学专题 openssl编译和安装
- clion编译器解决undefined reference to symbol ‘shm_open@@GLIBC_2.2.5‘
- Python学习13 异常处理机制