
C++知识
jigetage
这个作者很懒,什么都没留下…
展开
-
解决Linux下delete后内存不立即释放的问题
在调用delete释放内存后,调用如何命令即可 int res = malloc_trim(0); if (1 == res) { std::cout << "memory cleaned__" << std::endl; } else { std::cout << "memory not cleane...原创 2019-05-20 14:23:31 · 3266 阅读 · 1 评论 -
读写锁是什么
前言:对于非计算机专业出身的朋友来说,很少会接触到读写锁这个高级概念,一般都只是使用到互斥量这一层。那么为什么有了互斥量(互斥锁)之后,还要发明读写锁呢?结论:读写锁是效率更高的互斥量(在大多数条件下)。理由:读写锁分为三种状态1,以读的方式占据锁的状态。此时,如果有另外线程请求以读的方式占据锁,那么不会阻塞,可以再次占据。如果有另外线程请求以写的方式占据锁,那么会阻塞,直...原创 2019-02-12 11:11:16 · 1578 阅读 · 0 评论 -
条件变量和互斥量的关系
一,先上结论:通过条件变量实现的阻塞,本质上依靠的是与条件变量相关联的互斥量,条件的检测是在互斥量的保护下进行的。当条件变量处于未触发的状态时,线程自动阻塞,并释放与条件变量相关联的互斥量。如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,被唤醒的线程重新获得互斥锁,重新评价条件。二,详细解释1,初始化#include <pthread.h&g...原创 2019-02-11 17:57:34 · 1228 阅读 · 1 评论 -
c++生成位数可控的随机字符串
#include <iostream>#include <stdlib.h>#include <time.h> char *generateRandString(char *str, const int len){// 产生随机数 srand(time(NULL)); int i; for (i = 0; i < len; ++i)...原创 2019-01-23 15:01:52 · 958 阅读 · 0 评论 -
c语言中的静态变量/c++类之外的静态变量有何作用
由于c语言基础不够扎实,就开始使用c++,所以一直对静态变量这个概念模棱两可,现在总结如下:本文只针对c++类外定义的静态变量,因为只有这个场景下的静态变量才和c语言的静态变量是同一个概念。1,全局静态变量全局变量,即在类/函数定义之外的变量,其是可以被多个文件访问到的。当加上static声明后,就只能在定义的文件内访问。由此体现出了静态的作用之一:隐藏与隔离作用域。2,局部静态变...原创 2019-02-01 14:48:39 · 1398 阅读 · 0 评论 -
“error LNK2019/LNK2001: 无法解析的外部符号”原因归类
先上结论:错误原因有3种情况:1,头文件中声明的函数,无法在.lib文件中找到实现,要么是缺少.lib文件,要么是.lib文件的引用路径不对;2,头文件中声明的函数,无法在.cpp文件中找到实现,要么是缺少.cpp文件,要么是.cpp文件的引用路径不对;3,缺少extern c声明 具体分析:最近在移植obs studio源码,出现了很多2019/2001的错误。编...原创 2019-01-09 13:14:00 · 5802 阅读 · 0 评论 -
c++类对象所占内存的计算
先上结论:对于一个空类,其实例化的对象占内存为1byte。对于非空的类来说,其实例化对象中,占内存的只有2个,一个是类内非静态成员变量,另一个是虚函数指针。详细分析:成员函数还是以一般的函数一样的存在。a.fun()是通过fun(a.this)来调用的。所谓成员函数只是在名义上是类里的。其实成员函数的大小不在类的对象里面,同一个类的多个对象共享函数代码。而我们访问类的成员函数是通过...原创 2019-01-08 13:51:27 · 908 阅读 · 0 评论 -
inline内联函数 static静态函数 普通函数区别
面试时候一般只会问你区别,所有本文只说区别。内联函数和普通函数的区别:内联函数和普通函数最大的区别在于内部的实现方面,当普通函数在被调用时,系统首先跳跃到该函数的入口地址,执行函数体,执行完成后,再返回到函数调用的地方,函数始终只有一个拷贝; 而内联函数则不需要进行一个寻址的过程,当执行到内联函数时,此函数展开(很类似宏的使用),如果在 N处调用了此内联函数,则此函数就会有N个代码段的拷贝...原创 2019-01-08 11:41:01 · 4665 阅读 · 0 评论 -
解决0xc000007b报错 64位msvcr120d.dll 免费免积分下载
亲测可用链接:https://pan.baidu.com/s/1DWSQ9IHEuAfiaWUtGBQIPg 提取码:wr2w 复制这段内容后打开百度网盘手机App,操作更方便哦原创 2018-12-28 13:28:06 · 825 阅读 · 4 评论 -
解决0xc000007b报错 64位msvcp120d.dll 免费免积分下载
亲测可用链接:https://pan.baidu.com/s/1PdHxDDvzphkgBYD2DfIBeQ 提取码:2hye 复制这段内容后打开百度网盘手机App,操作更方便哦原创 2018-12-28 13:24:55 · 1285 阅读 · 4 评论 -
windows发布qt程序依赖库qtwindows qtcore qtwidgets等的终极解决方案
先给出答案:利用windeployqt.exe解决,windeployqt.exe的位置在qt的vs插件的bin目录下。原因:采用qt开发windows桌面程序,由于qt已经安装在了系统路径下,所以在开发的机器上是不会出现找不到依赖库问题的。但是,当我们打包之后,放到客户机上,客户是肯定不会为了用你的程序,去安装一个完整的qt,而且版本还需要和你开发时候使用的一模一样。所以,就需要我们...原创 2018-12-28 12:03:09 · 1351 阅读 · 0 评论 -
c++11引入的delete关键字和声明成私有private有什么区别
答案:大部分没有区别,都是不能在外部访问这个函数。区别在于:只在使用模板函数时,只能采用delete特化,不能采用private特化。如下:在模板特例化中,也可以用 delete 来过滤一些特定的形参类型。例如,Widget 类中声明了一个模板函数,当进行模板特化时,要求禁止参数为 void* 的函数调用。如果按照 C++98 的 “私有不实现“ 思路,应该是将特例化的函数声明...原创 2018-12-27 11:37:26 · 1435 阅读 · 1 评论 -
如何自己实现字符串拷贝函数
一般写法:char *my_strcpy(char *dst,const char *src){ assert(dst != NULL); assert(src != NULL); char *ret = dst; while((* dst++ = * src++) != '\0') // 运算符优先级++高于* ; return ret;}可以看到很简单,只需考虑三...原创 2018-12-20 17:43:29 · 5292 阅读 · 1 评论 -
字符串处理中sizeof与strlen区别,以及末尾的\0
char *ch = "wonima aisaoziaaa"; int n = sizeof(ch); // 指针长度,对于64平台来说,值为8 int nn = sizeof(*ch); // 一个字符的长度,值为1 int nnn = strlen(ch); // 字符串的长度,不算上末尾的\0,值为17 char sz[] = "wonima ai...原创 2018-12-20 17:29:17 · 5606 阅读 · 0 评论 -
如何利用函数指针绑定类内非静态成员函数
绑定普通函数和类静态成员函数到函数指针语法很简单,语义很明显,容易记忆。但是类非静态成员函数,由于涉及特殊的隐藏参数this,就稍微复杂了。在c++11出来之后,又简单起来了。通过可调用成员包装器std::function 和 std::bind即可完美实现...原创 2018-12-06 23:03:35 · 401 阅读 · 0 评论 -
C++深拷贝&浅拷贝
先上结论:深拷贝:拷贝的是指针所指向的一整块内存,即将指针pSrc所指向的一整块内存,拷贝出来,然后赋值给指针pDst所指向的一个区域,核心代码是char* pDst = new char[128];memcpy(pDst, pSrc, sizeof(pSrc));浅拷贝:拷贝的是指针的值,即将指针pSrc赋值给了pDstchar* pDst = nullptr;pDst ...原创 2018-12-06 23:00:20 · 988 阅读 · 0 评论 -
通过引用计数实现智能指针
通过模板和引用计数的方式实现智能指针,需要两个类:智能指针类SmartPtr,和智能指针辅助类SmartPtrHelper,其中用户接触到是SmartPtr类,而SmartPtr类通过SmartPtrHelper管理指针的内存和计数。具体实现如下:SmartPtrHelper类//模板类作为友元时要先有声明template <typename T>class SmartP...原创 2019-02-12 13:58:57 · 272 阅读 · 0 评论 -
递归锁 非递归锁
一、先上结论:递归锁:同一个线程在不解锁的情况下,可以多次获取锁定同一个递归锁,而且不会产生死锁;非递归锁:在不解锁的情况下,当同一个线程多次获取同一个递归锁时,会产生死锁。二、典型应用:windows下的互斥量和临界区(关键段)是递归锁;linux下的互斥量pthread_mutex_t是非递归锁,但是可以通过在创建互斥量时设置PTHREAD_MUTEX_RECURSIVE属...原创 2019-02-13 10:40:01 · 6698 阅读 · 0 评论 -
相同c++程序在Linux和windows下不能共用
为什么同样的c++代码(不引用系统库函数)在Linux下和windows下编译出来的可执行程序不能共用?答案:Linux下gcc或g++编译出的可执行文件文件头是ELF windows下可执行文件头是PE,所以不能共用。方法:所以只要把Linux下编译出的可执行文件头去掉,然后加上一个PE文件头就可以在windows下跑了。...原创 2019-04-19 18:03:11 · 1343 阅读 · 0 评论 -
协程和线程的区别
最近学习go语言,接触了协程的概念,对线程和协程的区别总结如下。协程属于线程,即一个线程下面可以开辟多个协程。协程是用户态的轻量级线程。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。当多个协程切换时,由于其同属于一个线程,所以可以看作是同步执行的,不存在同时共享资源的情况,可以不加锁的访问全局变量,...原创 2019-04-15 10:05:10 · 3998 阅读 · 0 评论 -
用cmake在windows下生成.dll版本的动态库遇到的问题
用cmake在windows下生成.dll版本的动态库,遇到的问题。问题1,生成的dll名字有问题。解决方案:采用extern{}包围住头文件中代码问题2,生成的dll没有接口,或者只生成了dll,而没有相应的导入库.lib。解决方案:添加dllexport,方法:#ifdef BUILD_XXX_DLL #define IO_XXX_DLL __declspec(dllexp...原创 2019-04-22 00:02:28 · 5417 阅读 · 0 评论 -
为什么会出现hash哈希散列
如何理解hash(又名哈希,或者散列)实现hash的数据结构示意图由图可知,哈希表其实就是一个一维数组,而数组中的每一个元素都是一个单向链表而已。这样的数据结构解决了数组的增删元素的不足和链表的查询效率的不足。哈希原理通过哈希算法(md4 md5 sha1 …)将任意长度的数据映射成固定长度,较少位数的二进制数据。以映射后的二进制数据为依据进行存储,构造成哈希表。在后续查找时,也是根据原...原创 2019-04-13 14:01:46 · 474 阅读 · 0 评论 -
c++ stl中的set
有关stl中的set,平时关注和使用的最少,往往会忘记他的特性。总结如下:跟vector和list相比,set中存储的数据天然有序;跟map相比,set中只存储key,没有value。set的声明如下template <typename T> set<T>;...原创 2019-04-13 13:20:11 · 151 阅读 · 0 评论 -
几种树的优缺点和应用场景
二叉树:解决的是线性表插入慢,链表查找慢的问题,是一种这样的方法。时间复杂度介于对数级和线性级之间。当是完全的平衡二叉树时,时间复杂度是对数级,当时完全的不平衡二叉树时,即已经退化为链表,是线性级。单纯的二叉树只是一个概念,并没有实际应用场景。二叉查找树:又名二叉排序树,二叉搜索树。如果存在左子树,那么左子树上所有节点均小于根节点,如果存在右子树,那么右子树上所有节点均大于根节点。并且,...原创 2019-03-27 15:01:50 · 3145 阅读 · 0 评论 -
树的高度、深度、层数
可能是全网最透彻的讲解树的基本概念的一篇文章了。对于很多朋友来说,特别是半路出家转码农的朋友来说,数据结构是最薄弱的一项了,线性表和链表还好理解(如果链表不懂的见我的另一篇文章https://blog.youkuaiyun.com/jigetage/article/details/88694867),一到树就完全懵逼了,甚至看不懂别的网友发的博客。大部分原因是不知道有关树的基本概念。这里总结出来,熟练背诵...原创 2019-03-26 16:31:28 · 6989 阅读 · 2 评论 -
c++ 模板template中的class和typename区别
在实际使用中注意以下两点即可。1,在类外或者方法外添加模板声明时,二者无区别。2,当template<typename T>或者template<class T>中的T是一个类类型,而且这个类又有子类(假设名为 innerClass) 时,应该用 typename T::innerClass 的方式来声明innerClass变量,比如:typename T::...原创 2019-03-22 09:38:27 · 3188 阅读 · 0 评论 -
为什么链表特别难以理解
为什么对于某些同学来说,链表特别难以理解?大概率的原因是没有分清楚节点和指向节点的指针这两个概念。节点:固定的,是一块内存区域,存储节点的信息。指向节点的指针:自由的,可以随意更改。下面通过两个典型代码进行详细分析。pNode1 = pNode2; // 这行代码的意思是:将pNode1 指针指向pNode2指针所指向的节点,造成一个节点被两个指针指向pNode1-...原创 2019-03-20 17:42:09 · 2276 阅读 · 0 评论 -
单链表中的环面试题目
对于链表中的环,常见面试题目有下面几个:1.给一个单链表,判断其中是否有环的存在?思路:采用快慢指针,快指针每次走2,慢指针每次走1,如果在快指针遍历链表结束之前,二者相遇,则说明有环。2.如果存在环,找出环的入口点?思路:从链表起点到环的入口点,与从快慢指针相遇点到环的入口点,距离相同。3.如果存在环,求出环上节点的个数?思路:1,采用已经进入环中慢指针遍历环,当再次到达...原创 2019-03-20 17:22:27 · 299 阅读 · 0 评论 -
对链表翻转/逆置的一些理解
// 写在前面,首先是要区分节点和指向节点的指针,链表在内存中是以节点的形式存在的,节点指针只是为了方// 便写程序的时候操作,而认为创造出来的。node* rev(node *head) {node *prev=NULL,*next=NULL; while(head){next=head->next; // 将next指针指向头结点的下一个节点head->next=p...原创 2019-03-20 16:35:03 · 171 阅读 · 0 评论 -
ZeroMQ教程入门学习攻略
本人在zeromq使用过程中主要参考了如下博客。1,概要和快速入门https://www.cnblogs.com/chenny7/p/6245236.html2,使用举例https://blog.youkuaiyun.com/brimsullowr/article/details/827704443,架构分析https://www.cnblogs.com/rainbowzc/p/335...原创 2019-03-15 18:00:30 · 6577 阅读 · 0 评论 -
QString和std::string转换乱码的解决方法
std::string cstring;QString qstring;//从std::string 到QStringqstring = QString(QString::fromLocal8Bit(cstring.c_str()));//从QString 到 std::stringcstring = std::string((const char *)qstring.toLocal8...原创 2019-03-19 18:23:02 · 6278 阅读 · 4 评论 -
cmake add_subdirectory如何添加根目录之外的文件目录
// 假设add_subdirectory需要添加的目录,是当前cmakelist.txt文件所在目录的同级目录的子目录if(NOT NEED_DIR) set( NEED_DIR ${CMAKE_SOURCE_DIR}/../PEER_DIR)endif()if( IS_DIRECTORY ${NEED_DIR} ) add_subdirectory( ${NEE...原创 2019-02-27 13:34:45 · 8034 阅读 · 2 评论 -
对waitforsingleobject的理解
当调用waitforsingleobject被阻塞时,说明在调用的时候所监视的内核对象是non-signaled状态。然后,开始阻塞等待,突然,发生了某种情况,导致监视的内核对象变成了signaled状态,这时waitforsingleobject函数解除阻塞,开始运行,运行完了,函数返回。在返回后,如果所监视的内核对象是自动置位的,那么内核对象变为non-signaled状态,否则继续保持sig...原创 2019-02-20 23:25:14 · 700 阅读 · 0 评论 -
为什么会出现unordered_map这个东西?
大多数同学对于顺序容器很熟悉,但是对于关联容器还是有些陌生,所以对map的掌握往往不够,更别说unordered_map这个c++11之后才写进标准库的新东西了。那么为什么会出现unordered_map这个东西呢?它解决了什么痛点?在解决这些痛点的同时,它又带来了什么问题呢?下面详细分析。1,解决了什么痛点?答:传统的map,内部实现的数据结构是红黑树,由于红黑树的每个节点都要存储其...原创 2018-12-03 17:00:20 · 736 阅读 · 0 评论 -
最简单的智能指针总结和教程
先说一个重点,智能指针不等于引用计数,不要一提起智能指针,就要说引用计数。应用场景:相比大家都写过一种业务类型吧,在处理开始前通过new申请了一块内存,然后通过多个if ... else if ... else if ... ... else进行处理,对于这种场景,在每一个if处理块内部都要进行new出来的那块内存的释放,否则就造成内存泄漏,代码太繁琐了。此时引入智能指针就可以完美解决。...原创 2018-12-08 18:07:39 · 357 阅读 · 0 评论 -
node-ffi如何调用c++ dll
原文地址:https://blog.youkuaiyun.com/cut001/article/details/69397022FUNCTION ulong DesEnCodeHex(string str, string key, ref string outstr) library "zm_2007.dll" int DesEnCodeHex(const char* str,const char* key...转载 2018-05-31 12:27:26 · 2046 阅读 · 1 评论 -
c++ 通过 libcurl库以Post方式向HTTP服务器提交数据
原文链接:点击打开链接一、上传数据如题:char name[] = "jgood";char address[] = "Hangzhou";上传这两个数据到http://localhost:2210/Default.aspx 该怎么办?直接上代码:int main(){ CURLcode code; code = curl_global_init(CURL_GLOBAL_ALL ...原创 2018-06-07 11:06:57 · 4076 阅读 · 0 评论 -
windows下c++代码保存dump文件
在main文件,或者其他的文件中添加如下代码:#include "Windows.h"#include "DbgHelp.h"int GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers){ // 定义函数指针 typedef BOOL(WINAPI * MiniDumpWriteDumpT)( HANDLE, DWOR...原创 2018-06-21 11:17:34 · 1653 阅读 · 0 评论 -
编译jsoncpp库时,release出错
原文链接:点击打开链接generated file: '../../build/vs71/release/lib_json\json_writer.asm': No such file or directory2013年04月24日 16:25:59阅读数:4998I'm trying to use json-cpp in Visual Studio 2010. I have no problem...原创 2018-06-11 17:27:31 · 590 阅读 · 0 评论 -
VS在调用dll时候出现Run-Time Check Failure #0,The value of ESP was not properly saved错误https://blog.youkuaiyun.com
原文地址 点击打开链接调用DLL函数,出现错误Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention ...原创 2018-06-11 15:18:32 · 1347 阅读 · 1 评论