内存问题提醒!结构体+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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

穷人迈向富翁的理财十步曲

当你每日的储蓄随着时间的累积,达到一定数量后再转存到存款薄里,如此日积月累,就可以逐渐养成自身存钱理财的习惯。不管你做什么事情,是否养成了良好的习惯,都会决定你的成败。理财投资也是同样道理,在你养…

【融云分析】选择IM云服务,需要看哪些核心技术指标?

IM(即时通讯)云服务已发展数年,不少企业与开发者都倾向于选择第三方IM云服务,短平快地为应用添加即时通讯能力,但如何选择服务商却是个难题,单从简单的功能介绍来看无法判断,因为IM云服务接入后…

Nginx 配置详解

序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。 Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI…

protocol buffers使用说明

一、什么是protocol buffers Protocol buffers是一个灵活的、高效的、自动化的用于对结构化数据进行序列化的协议,与XML相比,Protocol buffers序列化后的码流更小、速度更快、操作更简单。你只需要将要被序列化的数据结构定义一次(译注:使用…

jeeCMS首页加载流程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gyshun/article/details/79669293 如果JEECMS部署完毕之后,在浏览器中输入http://localhost:8080/jeecms,系统直接会按照以下步骤执行: 首…

车子突然溜坡追尾 驾校教练说挂P挡拉手刹不会溜坡

昨天4:44,朱先生来电:刚才登云路一个烧烤店门口,一辆车停在自己的车位上的,不知什么原因,突然溜坡撞上前面的一辆出租车。稀奇的是,这个溜坡的驾驶员全程都是车上睡觉睡着的,什么都不知道。记者…

VSCode 汉化、设置为 中文语言显示 、中文界面

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 Vscode是一款开源的跨平台编辑器。默认情况下,vscode使用的语言为英文(us),如何将其显示语言修改成中文了&#…

c++执行vbs脚本

#include<fstream> using namespace std;int main() {fstream out("StartIE.vbs",ios::out);out<<"AppName\"启动IE\"\n\Set WshellWScript.CreateObject(\"WScript.Shell\")\n\Set ieWScript.CreateObject(\"InternetEx…

Python-21-socket编程

一、基础知识 1. C/S架构 C/S架构即客户机/服务器模式。 它可以分为客户机和服务器两层&#xff1a; 第一层: 在客户机系统上结合了界面显示与业务逻辑&#xff1b; 第二层: 通过网络结合了数据库服务器。 简单的说就是第一层是用户表示层&#xff0c;第二层是数据库层。 这里…

解决:VScode 汉化后 、设置中文后 还显示英文的问题

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 按f1 搜索 Configore Display Language 设置 zh-cn 关闭软件重启。 如果重启菜单等还是英文的&#xff0c;在商店查看已安装的插件&…

自动挡怎么开-自动挡汽车怎么开?

汽车改用自动变速器后&#xff0c;驾驶员的操作更加简便、驾驶更加平顺&#xff0c;因此装备自动变速器的新型轿车尤其受到了人们的青睐。不过&#xff0c;很多驾驶者初开自动挡车时&#xff0c;由于对自动变速器的结构和原理不是很了解&#xff0c;行车时经常是一个D挡走完全程…

CreateThread函数

创建一个在调用进程的虚拟地址空间内执行的线程。 要创建在另一个进程的虚拟地址空间中运行的线程&#xff0c;请使用 CreateRemoteThread函数。 语法 HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START…

nginx 的请求处理、请求的处理流程

nginx的请求处理 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 nginx使用一个多进程模型来对外提供服务&#xff0c;其中一个master进程&#xff0c;多个worker进程。master进程负责…

如何控制油门更准确?

学员问&#xff1a;平时练车还不错&#xff0c;可是一换车就容易加大油门&#xff0c;有什么方法能很好的控制油呢&#xff1f;&#xff1f; 如何控制油门更准确&#xff1f;和调的座位有关系吗&#xff1f;&#xff1f; 答&#xff1a;油门跟刹车被视为汽车控制的灵魂。汽车发…

使用线程——创建线程

CreateThread函数创建一个进程的新的线程。创建线程必须指定新线程要执行的代码的起始地址。通常&#xff0c;起始地址是程序代码中定义的函数的名称&#xff08;有关更多信息&#xff0c;请参阅ThreadProc&#xff09;。此函数采用单个参数并返回DWORD值。一个进程可以让多个线…

location

location (地址)&#xff1a; 是浏览器 window 上的一个对象&#xff0c;不仅能处理当前页面的网络地址&#xff0c;还可以实现页面间的跳转 页面的跳转&#xff1a; 为什么使用它&#xff1f; 使我们也可以通过脚本语言&#xff0c;也能实现 a 链接&#xff0c;同样的效果&…

linux :Docker 方式 安装 zookeeper、阿里服务器上 Docker 运行 zookeeper

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 查找官方镜像&#xff0c;并下载镜像&#xff1a; # 搜索镜像&#xff1a; docker search zookeeper# 拉取镜像&#xff1a;docker …

使用线程池功能

此示例创建自定义线程池&#xff0c;创建工作项和线程池计时器&#xff0c;并将它们与清理组关联。该池由一个持久性线程组成。它演示了以下线程池函数的使用&#xff1a; CloseThreadpool CloseThreadpoolCleanupGroupCloseThreadpoolCleanupGroupMembersCloseThreadpoolWait…

制动刹车片六个养护要点

刹车片属于消耗品&#xff0c;在使用中会逐渐磨损&#xff0c;当磨损到极限位置时&#xff0c;必须更换&#xff0c;否则将降低制动的效果&#xff0c;甚至造成安全事故。 制动刹车片关乎生命安全&#xff0c;必须谨慎对待。 大多数轿车采用前盘后鼓式制动器结构&#xff0c;一…

Learn day4 函数参数\变量\闭包\递归

1.函数描述 # ### 函数 """ (1)函数的定义:功能 (包裹一部分代码 实现某一个功能 达成某一个目的) (2)函数特点:可以反复调用,提高代码的复用性,提高开发效率,便于维护管理 """# (3) 函数的基本格式 """ # 函数的定义处 def fun…