C++
文章平均质量分 71
Simple Simple
biubiubiu...
展开
-
浅谈C++跨模块释放内存
浅谈C++跨模块释放内存一, MT改MD二, DLL提供释放接口三, 使用进程堆申请内存 在开发主程序和动态库时,首要原则就是:避免跨模块申请和释放内存。这一点,我们在很多开源库或者平常项目中也都碰到过,对于动态库中的堆内存申请与释放,动态库总是会提供两个接口分别实现new和delete操作,而不会让调用方自己去操作。但有时候如果违背了这个原则呢,在linux平台上不会存在这样的忧虑,因为在linux下,每个进程只有一个heap,在任何一个动态库模原创 2020-05-09 20:12:07 · 9942 阅读 · 2 评论 -
c++实现rtsp点播客户端
c++实现rtsp点播客户端RTSP协议简介LIVE555的testRTSPClient.cpp简介RTSP视频流的处理RTSP协议简介简单来说,RTSP协议是一种基于命令形式的协议,对于服务端S和客户端C,两者的命令交互过程为:第一步:查询服务器端可用方法1.C->S:OPTION request //询问S有哪些方法可用1.S->C:OPTION respo...原创 2018-10-11 20:12:21 · 15249 阅读 · 1 评论 -
C++修改图片大小
C++修改图片大小一,OpenCV改变图片大小二,FreeImage改变图片大小三,结论     前段时间做一个项目需要将4K的图片缩小为A纸大小(595.0 * 842.0),在网上找了几种方式,最终决定直接选用第三方库Opencv和FreeImage,并对这两种方法的效果做了一个对比,由于图像处理没有深入学习过,在此只看处理后的效果,不做具体...原创 2019-01-02 21:45:05 · 13425 阅读 · 0 评论 -
const_cast,dynamic_cast,reinterpret_cast,static_cast四种转换的区别
const_cast,dynamic_cast,reinterpret_cast,static_cast四种转换的区别一,const_cast一,dynamic_cast一,reinterpret_cast一,static_castC++是一种强类型语言,对类型的检查非常严格,我们可以使用C语言中的(NewType)Expression来对某个变量或者表达式返回值进行强转,也可以使用C++中提供...原创 2019-02-02 09:34:19 · 18243 阅读 · 6 评论 -
memmove和memcpy区别
memmov和memcpy区别     memcpy()和memmove()都是c语言的库函数,在头文件string.h中,作用是拷贝一定长度内存的内容。它们唯一的区别是当内存发生局部重叠时,memmove可以保证拷贝正确,memcpy拷贝的结果是未定义的(取决于编译平台内部对memcpy的优化处理)。函数声明如下:void * memmov...原创 2019-02-12 13:16:13 · 19152 阅读 · 2 评论 -
memcmp比较结构体
memcmp比较结构体例子1:例子2:在日常编码中,有时为了方便,当一个结构体内不含有指针成员时,我没会使用memcmp来对两个结构体进行比较,但是这种做法不是一个正确的方法,也可能会导致错误的比较结果,我们以下面的例子来进行验证。例子1:#include <iostream>struct Info{ char a; int b;};int main(){ I...原创 2019-03-14 22:37:46 · 10713 阅读 · 0 评论 -
C++虚表地址和虚函数地址
C++虚表地址和虚函数地址虚函数是c++实现多态性的一个重要知识点,本文主要解析虚函数在内存中的地址,以及与虚表地址的关系。声明一个类,包含两个虚函数,一个普通成员函数和一个类成员。调试程序,查看test对象的内存分布如下:_vptr是一个指向虚表的指针,可以理解为一个int* p[2],在本例中,p[0]是指向Test::func1()地址的指针,p[1]是指向Test::func2...原创 2019-04-12 20:17:44 · 8418 阅读 · 0 评论 -
const char * 和 std::string.c_str()引起的坑
const char *和std::string.c_str引起的坑一,发现问题二,解决方法今天早上有同事说调用封装好的编码转换函数,有时候能转换成功,有时候转换会失败,一听现象我就猜测是用法导致的问题,定位下来果然是用法使用有误,当然也跟我们封装的函数有关,记录下来,避免再次采坑。一,发现问题该编码转换函数实现如下://ANSI转UTF8static std::string AnsiT...原创 2019-08-21 19:47:45 · 9625 阅读 · 0 评论 -
C++仿函数和Lambda表达式
C++仿函数和Lambda表达式一,普通函数二,仿函数三,Lambda表达式四,Lambda外部变量捕获     在使用algorithm算法库中的很多函数时,最后一个参数都是需要传入一个函数指针,当对数组或者容器数据遍历时,通过函数指针指向的函数内部的逻辑处理进行过滤,筛选出符合条件的值并进行结果统计或返回。第三个参数的实现形式,从最开始的普通...原创 2019-01-21 20:14:58 · 14509 阅读 · 1 评论 -
C++代码静态检测
C++代码静态检测一,CppCheck(下载地址:http://cppcheck.net/)1,使用CppCheck客户端检测2,在vs中使用CppCheck二,TscanCode(下载地址:https://github.com/Tencent/TscanCode)三,PVS-studio(下载地址:https://www.viva64.com/en/pvs-studio/)1,安装2,破解3,使...原创 2019-01-18 23:42:49 · 17839 阅读 · 0 评论 -
RapidXml读取并修改XML文件
RapidXml读取并修改XML文件RapidXml介绍RapidXml读取与修改xml文件RapidXml介绍RapidXml尝试创建最快的XML解析器,同时保留可用性,可移植性和合理的W3C兼容性。它是一个用现代C ++编写的原位解析器,解析速度接近strlen在同一数据上执行的函数。它仅仅只由四个头文件组成,并不要单独进行配置编译,使用起来非常方便。在RapidXml的官网上,它发布了...原创 2018-10-18 11:42:37 · 11708 阅读 · 0 评论 -
ANSI,UNICODE,UTF8之间的相互转换
ANSI,UNICODE,UTF8之间的相互转换ANSI转UNICOEUNICODE转ANSIUTF8转UNICODEUNICODE转UTF8ANSI转UTF8UTF8转ANSIANSI转UNICOEstd::wstring AnsiToUnicode(const std::string &strAnsi){ //先获取到转为unicode后的长度 int nUnicodeLe...原创 2018-10-23 10:15:10 · 14805 阅读 · 0 评论 -
C++ TIMER与线程的关系,以及WM_TIMER消息的不准确性
C++ TIMER与线程的关系,以及WM_TIMER消息的不准确性一,SetTimer介绍二,定时器与线程的关系三,WM_TIMER的不准确性四,解决方案一,SetTimer介绍SetTimer函数定义如下:UINT_PTR SetTimer(HWND hWnd, // 窗口句柄UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器UINT...原创 2018-10-23 17:57:09 · 11058 阅读 · 0 评论 -
C++ 内存泄漏检测方法
C++ 内存泄漏检测方法一,Mfc程序的内存泄漏检测二,普通c++程序的内存泄漏检测三,未完待续,,,程序中通常包含着静态存储区和栈内存。静态存储区也就是静态内存,是用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量(全局变量)。栈内存用来保存定义在函数内的非static对象。分配在静态或栈内存中的对象由编译器自动创建和销毁。对于栈对象,仅在定义的程序块运行时才存在...原创 2018-10-26 14:43:28 · 10249 阅读 · 0 评论 -
realloc函数使用注意事项
realloc函数使用注意事项realloc是c语言中常用的内存重分配函数,函数声明如下:/*** 重新分配内存大小* @param mem_address: 需要改变内存大小的指针* @param newsize: 内存新的大小* @return void**/void *realloc(void *mem_address, unsigned int newsize);rea...原创 2018-11-09 16:49:37 · 9716 阅读 · 0 评论 -
IOCP完成端口模拟线程池
IO完成端口的使用一,样例介绍一,样例介绍生产者-消费者模式是一种非常常见的设计模式,它可以很好地模拟实际编程中的大部分使用场景,而IO完成端口也是用来实现多线程之间的通信,因此,本实例基于该模式完成。首先,我们需要创建IO完成端口,最后一个参数为0,默认创建的IO完成端口数目就是处理器数目,同时,和要创建一定数目的消费者线程,来处理数据。//创建1个IO完成端口(最后一个参数为0表示创建...原创 2018-11-08 17:55:30 · 9006 阅读 · 0 评论 -
为什么一定要调用fclose函数
为什么一定要调用fclose函数带缓存的文件操作是标准C 库的实现,第一次调用带缓存的文件操作函数时标准库会自动分配内存并且读出一段固定大小的内容存储在缓存中。所以以后每次的读写操作并不是针对硬盘上的文件直接进行的,而是针对内存中的缓存的(何时从硬盘中读取文件或者向硬盘中写入文件有标准库的机制控制)。当缓存区域中的内容达到一定大小时,标准库会将该缓存内容刷新到磁盘上,此时才完成文件的真正写入。...原创 2018-12-03 19:14:38 · 14328 阅读 · 1 评论 -
STL中的map容器屏蔽掉自动排序
STL中的map容器屏蔽掉自动排序map容器介绍屏蔽map自动排序map容器介绍template < class Key, class T, class Compare = less,class Allocator = allocator<pair<const Key,T> > > class map;key:关键原创 2018-09-25 16:02:16 · 20959 阅读 · 12 评论