C++language and related
文章平均质量分 75
用于学习C/C++相关知识的记录
zhanghuaichao
这个作者很懒,什么都没留下…
展开
-
17.windbg-!cs、~~[TID](经典死锁)
最近自己写程序遇到了死锁的问题,看了网上网友的文章写的很好,转载过来,作为一个学习的方向原文链接https://blog.csdn.net/hgy413/article/details/7572097#comments,这位大神对windbg和汇编都有很多优秀的原创文章先上个代码,自己随手写的:#include <windows.h > CRITICAL_SECTION cs1;CRITICAL_SECTION cs2; DWORD __stdcall thread1(.转载 2020-06-05 21:42:40 · 512 阅读 · 0 评论 -
Lambda表达式的本质
lambda表达式又叫做匿名函数,lambda表达式本质是一个匿名类,下面咱们开始介绍下lambda表达式。原创 2023-02-26 11:07:38 · 5241 阅读 · 1 评论 -
C++ pure virtual method called报错,与原因分析
C++ pure virtual method called原创 2023-02-12 23:16:20 · 3311 阅读 · 0 评论 -
C++中的多态
虚函数表原创 2023-02-12 17:19:39 · 237 阅读 · 0 评论 -
仿函数和重载<在sort和set中的应用
这里记录下仿函数和重载<在 sort和set 中的应用#include<iostream>#include<vector>#include<set>using namespace std;class Data{public: Data(int aa){ a_=aa; } /*bool operator < (const Data&d2) const{ return this-&.原创 2022-05-03 08:06:36 · 197 阅读 · 0 评论 -
带继承和组合关系的类中构造函数和析构函数的调用顺序
1.构造函数构造函数的调用顺序如下:基类构造函数,C++提出的成员初始化列表,对象成员构造函数(非指针类型),派生类本身的构造函数。2.析构函数调用顺序,析构函数的调用顺序如下:(析构函数的调用顺序正好和构造函数的调用顺序相反)派生类本身的析构函数,对象成员的析构函数,基类的析构函数。这里没有写这个C++提出的成员初始化列表的原因是,他只是负责构造了,构造之后,析构就都是调用对象成员的析构函数了。这里给出具体的例子看下:首先这个例子先不给出 C++提出的成员初始化列表,让我们原创 2022-04-22 09:54:48 · 1202 阅读 · 2 评论 -
Typedef的作用
1.定义一种类型的别名,而不只是简单的宏替换。例子:typedef unsigned char uint_8;typedef char int_8;typedef std::shared_ptr<Table> TablePtrType;2.用在旧的C的代码中(具体多旧没有查),帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名 对象名,如: struct tagPOINT1 { int x; in原创 2022-01-10 11:32:26 · 770 阅读 · 0 评论 -
std::function与std::bind的使用总结
文章转载自:C++中函数指针的用途非常广泛,例如回调函数,接口类的设计等,但函数指针始终不太灵活,它只能指向全局或静态函数,对于类成员函数、lambda表达式或其他可调用对象就无能为力了,因此,C++11推出了std::function与std::bind这两件大杀器。std::function vs 函数指针C++函数指针相信大家用的很多了,用法最广泛的应该就是先定义函数指针的类型,然后在声明一个函数指针的变量作为另一个函数的入参,以此作为回调函数,如下列代码所示:typedef voi原创 2021-04-12 19:54:56 · 3156 阅读 · 1 评论 -
关于C/C++编译器
我们在开始学习C/C++语言之前肯定得会学习程序运行的过程,主要是编译器在起到很大的作用,包括预处理:把头文件替换,宏替换,编译优化:转化为汇编语言汇编阶段:把汇编语言翻译成机器指令链接阶段:将目标文件链接起来生成可以执行的文件。那么常见的编译器有哪些呢?1.GNU Compiler Collection (GCC)GCC 原来作为GNU 操作系统的官方编译器,但是后来已经作为类unix操作系统:比如 linux,Mac OS x等,采纳为标准的编译器,GCC也同样支持Win原创 2021-04-09 14:27:13 · 1223 阅读 · 0 评论 -
c11中新增加容器
转载自https://zhuanlan.zhihu.com/p/137428884本文主要对C++11/14中标准库新增容器的特性进行详细说明,方便大家学习参考。1.std::array为什么要引入这个容器呢?主要有两点原因:A.std::vector太强大了,存储在堆内存中,而std::array存储在栈内存中,访问更加灵活,可以获得更高的性能;B. 使用std::array能够让代码变得更加现代,且封装了一些函数和算法,使用起来比传统数组更方便;std::array会在编译时...转载 2020-12-02 03:24:10 · 621 阅读 · 0 评论 -
结构体内存对齐的原因以及如何进行内存对齐
1.结构体内存对齐的原因?什么是对齐,以及为什么要对齐: 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,原创 2020-11-16 19:47:17 · 1335 阅读 · 0 评论 -
关于VS2013中的生成,重新生成,仅用于项目生成,重新生成
最近在编写代码中遇到了一个非常奇葩的问题,就是我再头文件中添加了一个锁的定义,就导致程序编译后必现崩溃,而且崩溃点和我的代码没有啥关系,后来花了将近一天的时间,定位出原因是我没有重新生成,而只是生成。下面说说下面四个的区别1.生成2.重新生成3.仅用于项目生成4.仅用于项目重新生成当一个解决方案中的项目没有依赖项目时,1.3相同,2.4相同。生成的意思是,如果你之前已经编译过了,那生成只是进行编译你改变的文件,不改变的文件就不再重新编译,直接进行连接了,这个在项目工程文件比较大的原创 2020-06-05 22:13:11 · 1732 阅读 · 0 评论 -
c++优先队列(priority_queue)用法详解
转自csdn的文章,仅作为学习笔记。原文链接:https://blog.csdn.net/weixin_36888577/article/details/79937886普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。首先要包含头文件#include<queue>, 他和queue不同的就在于我们可以.转载 2020-06-05 22:00:45 · 1495 阅读 · 0 评论 -
C++智能指针计数问题
一、关键每个shared_ptr所指向的对象都有一个引用计数,它记录了有多少个shared_ptr指向自己shared_ptr的析构函数:递减它所指向的对象的引用计数,如果引用计数变为0,就会销毁对象并释放相应的内存引用计数的变化:决定权在shared_ptr,而与对象本身无关二、引用计数初步 1 2 3 4 5 shared_ptr<int> sp;//空智能指针...转载 2020-06-03 20:33:20 · 1215 阅读 · 0 评论 -
C++ 动态分配内存的好处
实例化一个类有两种方式:// 假设有一个类A// 方式一:直接定义法A a;// 方式二:动态内存分配法A * a = new A();两者有什么差别呢?实际上,方式二即等价于如下代码:A * a = new A();等价于A * a;a = new A();方式一就是直接将a放入栈区(局部变量,大小受限,自动释放);方式二则是在堆区(动态内存,大小任意,手动释放)分配一块内存,然后用指针a去指向这块内存;那么我们很容易就知道为什么要使用动态内存分配来实例化转载 2020-05-16 20:26:47 · 2628 阅读 · 0 评论 -
对于申请内存常见的错误分析
题目:void GetMemory(char *p){p = (char *)malloc(100);}void Test(void){char *str = NULL;GetMemory(str);strcpy(str, "hello world");printf(str);}请问运行Test 函数会有什么样的结果?分析:程序崩溃。因为GetMemory 并不能传递动态内...转载 2020-03-12 19:52:07 · 1126 阅读 · 0 评论 -
C++语言中函数参数传递的本质是值传递
C语言中只有值传递,也就是传递副本,指针传递的只是地址的副本当然,如果你传递了一个指向某个变量的指针,而函数对该指针执行了间接访问操作,那么函数就可以改变那个变量,但参数还是传值方式传递的,这是两个概念,不矛盾。而对于引用传递,表面上看不会产生一个副本,看下面的代码吧,不多多了#include<iostream>#include<string>using ...原创 2020-03-05 19:57:19 · 568 阅读 · 0 评论 -
strcpy,memcpy,memmove的区别
一.memcpy与strcpystrcpy和memcpy主要有以下3方面的区别。1.复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。2.复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,如果空间不够,就会引起内存溢出。memcpy则是根据其第3个参数决定复制的长度。3.用途不同。通常在复制...原创 2020-03-03 14:18:15 · 377 阅读 · 0 评论 -
char 和 unsigned char 的区别
1、char取值范围是 -128~+127。2、我们先来看 signed char的最大值。 最高位是 符号位, 0 代表正数; 1 代表负数。0 1 1 1 1 1 1 1 这个值等于 2^0 + 2^1 + 2^2 + 2^3 + 2^4 + 2^5 + 2^6 = 127 。 也有一个简便计算方法:2^7 -1 = 128-1 =127 所以,signed...原创 2020-03-03 09:31:22 · 36377 阅读 · 2 评论 -
用C++实现遍历windows下的所有进程然后根据路径名字正则表达式判断后,取pid杀死特定的进程
#include <iostream>#include <windows.h>#include <tlhelp32.h>#include <string>#include <tchar.h>#include <Psapi.h>#include <map>#include <regex>...原创 2020-03-02 16:58:30 · 799 阅读 · 0 评论 -
C++命名空间 namesapce
最近在使用命名空间,想把命名空间总结下,现在只是简单的记录下使用的心得,后期会进行进一步的整理1.就是我们是把我们的.cpp文件和.h文件都使用相同的命名空间,如果不这样做 ,会可能出现下列问题。1.1 只在头文件中使用,那么要包含头文件,使用头文件里声明的类或者方法时,要using namespace ...而在.cpp中没有使用 ,起不到保护的作用。1.2只在cpp中使用,那.........原创 2019-12-10 14:14:17 · 386 阅读 · 0 评论 -
二级指针(指向指针的指针)
指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份指针类型的数据,例如 int *、double *、char * 等。如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示:将这种关系转换为C语言代码:...转载 2019-09-26 15:43:13 · 6306 阅读 · 8 评论 -
结构体指针
结构体指针分为两类 一类是指向结构体变量的指针,一类是指向结构体数组的指针指向结构体变量的指针前面我们通过“结构体变量名.成员名”的方式引用结构体变量中的成员,除了这种方法之外还可以使用指针。前面讲过,&student1 表示结构体变量 student1 的首地址,即 student1 第一个项的地址。如果定义一个指针变量 p 指向这个地址的话,p 就可以指向结构体变量 st...转载 2019-09-26 15:43:01 · 124 阅读 · 0 评论 -
VC++实现串口通信的应用程序设计
1 - VC++实现串口通信的应用程序设计 摘 要:本文介绍了结合了Win32 的API 函数和C++类的基本思想封装的一个串行通信类CSerialPort 类。并通过具体的实例详细介绍其在VC++6.0 下的实现串口通信方法和过程。关键词:VC++,串口通信,CSerialPort 类转载 2015-12-10 17:38:55 · 3124 阅读 · 0 评论 -
用for循环进行一定次数的发送操作,结果发送的次数非常多,跟本停不下
师弟在做实验时,用32单片机的串口向上位机发送1024字节的数据,结果在串口上看到的是永不停止的数据上传上去了。程序如下:u8 i=0;for(i=0;i usart1denddate();原因很简单,就是因为u8 i最大的数是255,结果到了255后就变为了0,所以永远不会到达for循环终止的条件,所以会在串口1上一直向上发送着数据。原创 2015-11-22 11:39:46 · 987 阅读 · 0 评论 -
C语言中变量初值问题
针对编译环境是VC++6.0(1)对与全局变量如果没有给变量赋初值,初值默认为0;测试代码如下:#includeint a;int main(void){printf("%d\n",a);return 0;}运行结果是:0(2)对于局部变量如果没有给变量赋初值,后果未知测试代码如下:#includeint main(void)原创 2015-09-10 15:25:36 · 1929 阅读 · 1 评论 -
C语言面试题大汇总之华为面试题
1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。 2、如何引用一个已经定义过的全局变转载 2015-09-10 09:38:29 · 1001 阅读 · 0 评论 -
memcop函数
原型: void *memcpy(void *dest, const void *src, size_t n);#include功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中Copies the values of num bytes from the location pointed by source directly转载 2015-09-09 18:42:04 · 2424 阅读 · 1 评论 -
C语言中的memset函数
(1)函数原型:void *memset(void *s, int ch, size_t n);函数解释:将s中前n个字节替换为ch并返回s;(2)头文件:在C中头文件是 or (3)应用memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。举例使用:(1 )清空字符型数组ch原创 2015-09-07 10:10:38 · 1213 阅读 · 0 评论 -
C 语言中的exit函数
在main函数中我们通常使用return (0);这样的方式返回一个值。 但这是限定在非void情况下的也就是void main()这样的形式。 exit()通常是用在子程序中用来终结程序用的,使用后程序自动结束跳会操作系统。 但在如果把exit用在main内的时候无论main是否定义成void返回的值都是有效的,并且exit不需要考虑 #include #i转载 2015-09-05 18:22:06 · 576 阅读 · 0 评论 -
C语言中变量定义的位置
今天编了一道C语言程序,编译的时候,出现错误,源码如下://输入一行字符串,统计大小写字母,空格的个数#include#includeint main(){char a[30];char *p=a;printf("please enter strings:\n");gets(p);int i=capital_letter=lowercase_lett原创 2015-09-04 10:22:05 · 3888 阅读 · 0 评论 -
C语言中文件包含#include使用尖括号和双引号的区别
用尖括号 #include 一般用于包含标准的库头文件,编译器会去系统配置的库环境变量和者用户配置的路径去搜索,而不会在项目的当前目录去查找用双引号 #include "":一般用于包含用户自己编写的头文件,编译器会先在项目的当前目录查找,找不到后才会去系统配置的库环境变量和用户配置的路径去搜索。转载 2015-09-03 17:08:34 · 949 阅读 · 0 评论 -
C++的三种单例模式-----深度解析
简介 因为在设计或开发中,肯定会有这么一种情况,一个类只能有一个对象被创建,如果有多个对象的话,可能会导致状态的混乱和不一致。这种情况下,单例模式是最恰当的解决办法。它有很多种实现方式,各自的特性不相同,使用的情...原创 2018-03-06 17:03:00 · 106171 阅读 · 34 评论 -
C++定义全局类对象
可能我这个全局类的说法不是很准确,不过其实就是变量的扩展延伸。比如你想把一个类让全部的CPP都能用,而不是一个变量,那么需要这样定义:假设有一个预编译头stdafx.h在stdafx.h中加入你想要的全局类的头文件: include “CMyClass.h” ; 在stdafx.cpp中加入类的定义 如:CMyClass myclass; 在你想要用到该全局CMyClass类的其他...转载 2018-09-08 10:17:37 · 25534 阅读 · 4 评论 -
C++中的 静态成员变量,全局类对象,单例模式
前段时间要实习一个充值接口,创建了一个类(就叫类A好了),这个类A要和另外3个类进行交互,3个类对类A修改的数据是对其他类可见的。这种情况我想到了3个方法:1.static 静态成员,静态成员为该类的所有实例所共享,3个类中各自创建一个类A的对象,它们对静态成员的修改对其他类可见。2.全局变量,类A的头文件中添加 extern classA g_classA; 源文件中添加 cla...转载 2018-09-08 10:23:19 · 2933 阅读 · 0 评论 -
对c++ public、protected、private关键字的理解
原文地址:https://www.cnblogs.com/fudong/p/5035900.html首先要明确一下:1.这三个关键字在两种地方会用到,一个是对类的成员变量和成员函数修饰时(比如私有的成员变量,受保护的成员变量·,公有的函数),还有一种是对继承方式的修饰(比如公有继承,保护继承)。2.这三个关键字在对成员变量或成员函数修饰时表示外部(与内部相对,若一个类包括一个.h文件和...转载 2019-05-22 09:19:11 · 1310 阅读 · 0 评论 -
关于extern "C"深度剖析以及宏__cplusplus的作用
在自己第一次接触C++ dll的概念以及书写dll的时候,就会在网上看到这样的说法,在dll导出的时候,一定要加上extern "C",至于为什么大概知道是因为,C编译器和C++编译器对函数的处理不太一样,所以要这样做,没有深追究,但是后来别人问起的时候,感觉总是说的不是特别的透彻。具体的问题可能如下:1.如果我的代码只是在C++上使用,也就是只是在C++的编译器上应用,而不是放到C编译...原创 2019-06-30 16:36:08 · 627 阅读 · 0 评论 -
GetProcAddress()函数动态调用DLL中的函数,是否必须通过extern C声明导出函数?
GetProcAddress()函数动态调用DLL中的函数,是否必须通过extern C声明导出函数?通过GetProcAddress函数动态调用dll中的函数,是否必须通过extern "C"声明导出函数?如题,网上搜了N多资料,一直找不到确定的答案,目前答案是“是”。很多资料上都只是说明“如果没有extern "C"修饰,输出函数仅仅能从 C++ 代码中调用”,却并没有明确这个调用...转载 2019-07-06 09:56:48 · 1066 阅读 · 0 评论 -
静态成员函数
(1)静态成员函数是类的一部分,而不是对象的一部分,与静态数据成员不同,静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员。(2)当调用一个对象的普通成员函数的时候,系统会把该对象起始地址,赋给成员函数的this指针,而静态成员函数,与任何对象都无关,因此静态成员函数没有this指针。因此决定了静态成员函数不能访问本类中的非静态成员,原创 2017-02-18 23:04:52 · 453 阅读 · 0 评论 -
C ++ 拷贝构造函数和赋值构造函数 非常经典
C++ 拷贝构造函数 赋值构造函数拷贝构造函数和赋值构造函数的异同由于并非所有的对象都会使用拷贝构造函数和赋值函数,程序员可能对这两个函数有些轻视。请先记住以下的警告,在阅读正文时就会多心:如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。以类String 的两个对象a,b 为例,Cla...原创 2016-10-26 11:53:50 · 4299 阅读 · 0 评论