2 Simple Simple

尚未进行身份认证

我要认证

biubiubiu...

等级
TA的排名 3w+

浅谈C++跨模块释放内存

浅谈C++跨模块释放内存一, MT改MD二, DLL提供释放接口三, 使用进程堆申请内存     在开发主程序和动态库时,首要原则就是:避免跨模块申请和释放内存。这一点,我们在很多开源库或者平常项目中也都碰到过,对于动态库中的堆内存申请与释放,动态库总是会提供两个接口分别实现new和delete操作,而不会让调用方自己去操作。但有时候如果违背了这个原则呢,在linux平台上不会存在这样的忧虑,因为在linux下,每个进程只有一个heap,在任何一个动态库模

2020-05-09 20:12:07

程序的编译与链接

程序的编译与链接一,预处理二, 编译1,词法分析2,语法分析3,语义分析4,中间语言的生成5,目标代码生成和优化三,链接     在日常的应用程序开发过程中,我们很少需要关注软件的编译和连接过程,特别是对于常用的集成开发环境visual studio,它将编译和链接的过程封装起来,一步完成,称为“构建”。   &n...

2020-03-08 23:20:41

在C++中使用信号和槽(sigslot库介绍)

在C++使用信号和槽(sigslot库介绍)一,使用场景二,sigslot库简介1,参数类型2,信号连接与槽3,信号与槽的断开4,信号的触发5,信号的线程安全6,槽的线程安全三,样例演示一,使用场景     在日常的代码开发过程中,我们经常会用到一种场景:当某个业务触发的时候,我们需要通知到不同的模块,让各个模块来处理这些触发的业务。这也就是设...

2020-02-29 20:25:09

Mysql 表字段修改 并发情况下避免重复

Mysql 表字段修改 并发情况下避免重复一,场景二,问题三,解决方案一,场景     多个用户同时修改用户名时,存在用户名相同的情况,而由于业务需要,用户名是不允许相同的,需要避免重复。二,问题     sql语句举例(伪代码): If(name not exited) (1) {...

2020-02-29 15:40:29

(TeamTalk服务端源码分析三)route_server源码分析

route_server源码分析     Route_Server是路由服务器,当存在多个MsgServer时,用户可能登陆在不同的MsgServer上(由Login_Server进行负载均衡),那么对于连接在不同的Msg_Server上的两个用户A和B如何进行消息转发呢,这个时候就需要用到Route_Server。  &n...

2019-12-09 21:01:08

套接字描述符的就绪条件

套接字描述符的就绪条件一,套接字可读二,套接字可写三,套接字异常四,代码演示     在使用select,poll,epoll等I/O复用模型时,我们一直在说当某个套接字描述符准备好读,或准备好写,或者在描述符上发生一个待处理的异常条件时,会触发相应的可读可写事件,下面对套接字描述的可读可写,以及异常条件做一个总结。一,套接字可读 ...

2019-12-03 21:50:44

(TeamTalk服务端源码分析二)Login_server源码分析

Login_server源码分析     Login_server是Teamtalk客户端最先通信的后台服务程序,客户端发送请求到login_server获取到负载最小的msg_server的地址,端口等信息,然后再连接到相应的msg_server上,发送登录请求,完成登录的流程。这样看来,虽然这个服务器名称是叫login_server,但是它承...

2019-11-21 20:29:01

(栈帧和函数调用三)函数返回值的传递

(栈帧和函数调用三)函数返回值的传递一,函数返回值在5-8字节之间二,函数返回值超过8字节三,使用对象作为函数返回值四,总结     在本系列第一篇文章的总结中,我们提到过,从该例子的汇编代码中可以看到,函数的返回值是保存在eax寄存器中,在x86环境中,eax是一个32位的寄存器,只占有4个字节,对于函数返回值超过4个字节的情况又是如何传递的呢...

2019-11-13 20:36:18

(TeamTalk服务端源码分析一)TeamTalk服务端部署

TeamTalk服务端部署在分析TeamTalk的各个服务器代码之前,我们先搭建一套服务端环境,结合之前的客户端,看一下一个IM聊天工具的基本功能。一、部署环境系统:centos7 X64位二,部署步骤1, 安装git gcc gcc-c++ mysql-devel unzip zipyum install -y git gcc gcc-c++ mysql-devel unzip zi...

2019-11-06 19:40:52

(栈帧和函数调用二)_stdcall和_cdecl的区别

栈帧和函数调用(二)一,函数调用惯例二,_cdecl三,_stdcall四,总结     通过上文的介绍,我们大致知道了函数调用时实际发生了什么,以及为什么我们使用编译器调试代码时,可以通过栈回溯看到整个调用的流程。从这样的信息里能够发现一个现象,那就是函数的调用方和被调用方对函数如何调用有这统一的理解,例如,它们双方都一致认同函数参数是按照某个...

2019-11-01 11:11:16

(栈帧和函数调用一)栈帧,函数调用与栈的关系

栈帧和函数调用(一)一,栈帧的介绍二,函数调用与栈的关系三,汇编演示     在计算机科学中,栈是一个特殊的容器,用户可以将数据压入栈中(入栈,push),也可以将已经压入栈中的数据弹出(出栈,pop),但栈容器必须准守一个规则:先入栈的数据后出栈(First In Last Out,FIFO)。    ...

2019-11-01 11:03:24

VC6.0中std::string析构函数崩溃问题分析

VC6.0中std::string析构崩溃问题分析一,问题描述二,std::string源码分析(VC6.0)三,问题分析与解决一,问题描述     今天程序停止运行时出现了崩溃,分析dump文件查看堆栈如下:     可以看到程序是在std::string析构函数中进行free操作时崩溃的...

2019-09-26 18:53:10

(Windbg调试八)崩溃捕捉的dump没有提供堆栈的问题

崩溃捕捉的dump没有提供堆栈的问题前两天客户现场出现了崩溃,但是程序捕捉生成的dump文件大小为0kb,没有办法只能通过任务管理器创建转储文件进行分析,但是分析这个dump时,却看不到任何有效的对战信息。输入!analyze -v命令输出如下:通过此堆栈信息看不出任何崩溃的具体原因。再输入~*kv命令查看所有线程的堆栈:可以看到崩溃的线程,输入~56s切换到该线程,再输入kv查看该线程的堆...

2019-09-13 13:09:33

DLL释放引起的死锁问题

DLL释放引起的死锁问题一,问题介绍二,问题分析三,问题总结一,问题介绍最近在做代码重构,今早对前两天重构的某个组件进行自测时,突然发现停止程序运行时,出现了卡死,进程退不出,查看日志发现是FreeLibrary没有走完。打开任务管理器-》性能-》资源监视器,找到进程,右键分析分析等待链,结果如下:出现了死锁,16800线程是主线程(调用FreeLibrary),12128是DLL中的工作...

2019-09-03 20:04:17

const char * 和 std::string.c_str()引起的坑

const char *和std::string.c_str引起的坑一,发现问题二,解决方法今天早上有同事说调用封装好的编码转换函数,有时候能转换成功,有时候转换会失败,一听现象我就猜测是用法导致的问题,定位下来果然是用法使用有误,当然也跟我们封装的函数有关,记录下来,避免再次采坑。一,发现问题该编码转换函数实现如下://ANSI转UTF8static std::string AnsiT...

2019-08-21 19:47:45

(Windbg调试七)c++内存泄漏问题定位

c++内存泄漏问题定位     内存泄漏指的是直接内存分配构造函数(例如new,malloc,HeapAlloc)来获得内存后,但是没有释放该片区域内存而导致的泄漏问题。我们的行情服务器是一个长期运行在客户服务器上的应用程序,如果存在内存泄漏,那么当内存增长到某个值时,会极大地影响当前机器的性能,直至影响我们的行情服务程序,甚至由于内存已不够而导...

2019-07-20 14:40:31

(Windbg调试六)c++句柄泄漏问题定位

c++句柄泄漏问题定位     在Windows内核中定义了一组操作系统特有的对象类型,包括文件对象,线程对象,Event对象等等。要使用某种对象类型,必须首先生成这种对象类型的一个实例,以事件对象为例,以CreateEvent可以创建或者打开一个有名的事件对象,在该函数内部,它调用了内核接口来创建一个事件对象,并且分配了相应的内存来容纳这个对象...

2019-07-17 20:02:23

DLL的导出函数

DLL的导出函数,__declspec(dllexport),.def模块定义文件,extern“C”区别一,__declspec(dllexport)二,.DEF模块定义文件三,__declspec(dllexport)和def文件的区别1,显式调用2,隐式调用四,结论     我们在编写动态库时,经常会用到类似extern“C”,__...

2019-07-11 19:54:29

修改lib库对应的dll名称

修改lib库对应的dll名称     在某些场景下,我们需要修改lib库对应的dll名称,这当然不是简单的给dll重命名一下,或者使用notepad++等工具打开lib文件,修改其中的dll名称。后一种方式会直接导致lib文件破坏,vs编译报错。     既然不能直接从lib下手,我们可以逆向考...

2019-07-08 20:14:46

(Windbg调试一)minidump崩溃捕捉

(Windbg调试四)dump崩溃捕捉一,系统的异常处理顺序二,SetUnhandleExceptionFilter函数三,Minidump四,代码演示平常我们编写c++代码时,发生崩溃,编译器都可以帮我们捕捉到并且定位到具体的代码,这是因为编译器接收到了操作系统发送过来的程序异常通知并进行了处理。但是在使用我们软件的用户环境上,没有编译器帮我们处理这个异常,操作系统会使用它的异常处理机制:弹出...

2019-07-03 20:12:49

查看更多

勋章 我的勋章
  • 签到新秀
    签到新秀
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 新人勋章
    新人勋章
    用户发布第一条blink获赞超过3个即可获得
  • 阅读者勋章Lv1
    阅读者勋章Lv1
    授予在CSDN APP累计阅读博文达到3天的你,是你的坚持与努力,使你超越了昨天的自己。
  • 专栏达人
    专栏达人
    授予成功创建个人博客专栏的用户。专栏中添加五篇以上博文即可点亮!撰写博客专栏浓缩技术精华,专栏达人就是你!
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv1
    勤写标兵Lv1
    授予每个自然周发布1篇到3篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。