内存的三种分配方式:
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做协议体发送!序列化相关推荐

  1. C语言内存管理之结构体

    内存管理之结构体 数据结构的意义 简单的数据结构-数组 数组的优势和劣势 使用方法和细节 结构体的声明 结构体的高级使用方法 结构体内嵌指针实现面向对象 数据结构的意义 数据结构就是研究数据如何组织( ...

  2. 【C 语言】结构体 ( 结构体类型定义 | 结构体类型别名 | 声明结构体变量的三种方法 | 栈内存中声明结构体变量 | 定义隐式结构体时声明变量 | 定义普通结构体时声明变量 )

    文章目录 一.结构体类型定义 二.结构体类型别名 三.结构体类型变量声明 1.使用结构体类型 ( 别名 ) 声明变量 2. 定义隐式结构体时声明变量 3.定义普通结构体时声明变量 二.完整代码示例 一 ...

  3. 【零基础学C语言】知识总结八:struct 结构体与 union 共用体

    struct 结构体 struct即结构体,C程序中经常需要用相关的不同类型的数据来描述一个数据对象.例如,描述学生的综合信息时,需要使用学生的学号.姓名.性别等不同类型的数据时,像这种数据类型总是在 ...

  4. 黑马程序员C语言基础(第八天)复合类型(自定义类型)(结构体)、共用体(联合体)、枚举enum、 typedef

    黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...

  5. c语言结构体加联合,C语言:结构体和联合体(共用体)

    结构体:struct 1.结构体变量的首地址能够被其最宽基本类型成员的大小所整除. 2.结构体每个成员相对于结构体首地址的偏移量(offset)都是成员的整数倍. 3.结构体的总大小为结构体最宽基本类 ...

  6. 对C语言 结构指针变量做函数的参数 结构作为函数的参数

    一.结构指针变量做函数的参数 /* 用指针变量作函数参数进行传送,这时由实参传向形参的只是地址,从而减少了时间和空间的开销. */ /* 计算一组学生的平均成绩和不及格的人数,用结构指针变量作函数参数 ...

  7. 转载——C语言中float,double类型,在内存中的结构(存储方式)

    最近在做一个数据格式分析和转换的项目,第一次接触底层的二进制代码存储,看的一头雾水,看到这个帖子后对于在Windows系统下数据的存储方式有了更多的了解,将原文分享一下: 原文地址为http://ww ...

  8. Shared pool内存块组成结构及4031错误原因分析

    这篇文章是参考甲骨论老相老师的教学视频所做的学习笔记: http://v.youku.com/v_show/id_XMzkyMDQ4MzUy.html 之前提到Shared pool的作用: Shar ...

  9. 防止内存泄露 Linux下用Valgrind做检查

    Valgrind技术参考 http://valgrind.org/docs/manual/tech-docs.html 防止内存泄露 Linux下用Valgrind做检查 发布时间:2007.10.2 ...

最新文章

  1. JavaScript 运行机制详解:Event Loop——续
  2. Azure Bill
  3. python打包zip文件_python 解压文件,合并文件 打包成zip格式文件 生成MD5值
  4. SpringAOP aspectJ ProceedingJoinPoint 获取当前方法
  5. mongo快速翻页方法(转载)
  6. 三维旋转矩阵_线性代数的本质(4)--矩阵乘法与复合变换
  7. 一个比较完整的pytorch项目
  8. postman访问abp接口因cookies问题导致400错误
  9. 庖丁解牛之spring源码系列一
  10. 基于PHP的超市库存管理系统
  11. mac系统我的世界服务器,我的世界Mac版怎么联机?
  12. php怎么在excel表格中输出换行,Excel表格怎么换行打字
  13. unity交通仿真_自动驾驶仿真该怎么玩
  14. 英雄无敌服务器维护,英雄无敌王国服务器地图攻略
  15. Unity3D网络游戏0.2
  16. Bootstrap3基础 table-striped 表格实现隔行换色(浅灰色与白色交替)
  17. PHP前一页 后一页 切换
  18. DataBinding找不到符号,import xxx.xxx.ActivityxxxBindingImpl
  19. 【读书笔记】《数学之美》——一个好方法在形式上总是简单的
  20. JavaScript提升(你不知道的JavaScript)

热门文章

  1. php多线程模拟请求,浅谈php使用curl模拟多线程发送请求
  2. 计算机专业英语霍洪涛出版社,计算机专业英语(霍洪涛)课件Chapter 4.ppt
  3. 日期时间格式之间的相互转换
  4. html中购物车总金怎么算额,计算购物车金额总和( jquery )
  5. 学习笔记16-C语言-小项目-使用Makefile完成2048
  6. 【精品计划 附录2】- 算法分析
  7. centos网络隔一段时间就断_计算机网络总结
  8. 密码学专题 openssl编译和安装
  9. clion编译器解决undefined reference to symbol ‘shm_open@@GLIBC_2.2.5‘
  10. Python学习13 异常处理机制