c++
阿翔同学
这不是通往幼儿园的车车
展开
-
C++智能指针-shared_ptr/weak_ptr
熟悉了unique_ptr 后,其实我们发现unique_ptr 这种排他型的内存管理并不能适应所有情况,有很大的局限!如果需要多个指针变量共享怎么办?如果有一种方式,可以记录引用特定内存对象的智能指针数量,当复制或拷贝时,引用计数加1,当智能指针析构时,引用计数减1,如果计数为零,代表已经没有指针指向这块内存,那么我们就释放它!这就是 shared_ptr 采用的策略!构造函数shared_ptr<T> sp; //空的shared_ptr,可以指向类型为T的对象sh.原创 2020-10-21 13:18:50 · 280 阅读 · 0 评论 -
C++11智能指针-unique_ptr
前面介绍了C++98 的智能指针auto_ptr,现在来介绍一下它的替代品【unique_ptr】看完,我也是醉了。好吧 我们继续auto_ptr是用于C++11之前的智能指针。由于 auto_ptr 基于排他所有权模式:两个指针不能指向同一个资源,复制或赋值都会改变资源的所有权。auto_ptr 主要有三大问题:复制和赋值会改变资源的所有权,不符合人的直觉。 在 STL 容器中使用auto_ptr存在重大风险,因为容器内的元素必需支持可复制(copy constructable)和可..原创 2020-10-21 11:05:55 · 145 阅读 · 0 评论 -
C++98智能指针auto_ptr
auto_ptrunique_ptrshared_ptrweek_ptr原创 2020-10-21 10:13:46 · 359 阅读 · 0 评论 -
C/C++可执行文件生成过程
生成过程 :预处理:处理#define【进行宏替换】 # if # endif ....... 编译:把程序转成 汇编 汇编:把汇编代码 转成 二进制数据 链接:链接 动态库 或者 静态库下面逐一详细的介绍:一.预处理1) 宏定义指令,如# define Name TokenString,# undef等。对于前一个伪指令,预编译所要做的是将程序中的所有Name用TokenString替换,但作为字符串常量的 Name则不被替换。对于后者,则将取消对某个宏的定义,使以后该串的出现..转载 2020-09-10 10:01:35 · 1043 阅读 · 0 评论 -
0,NULL和nullptr的区别
这次我回过头给大家讲解一下大家平常使用非常平凡0,NULL和nullptr的区别。别问我为什么要介绍他们的区别那我只能用图来表示我的回答一.在C语言中 NULL其实就是一个宏(表示把 0 强制类型转换成void *)#define NULL (void *)0char *p = NULL;二.在C++中#define NULL 0char *p = NULL;char *q = nullptr;那么问题来了为什么 C++中 NULL 和 C中的 NULL 表示的.原创 2020-06-23 07:56:07 · 1975 阅读 · 0 评论 -
C++的动态析构
多态是C++的一个重要特性,但是再使用多态的时候又有 非常多的陷阱,例如这个析构函数,请看下面的代码#include <iostream>#include <Windows.h>#include <string>using namespace std;class Father{public: Father(const char* _na...原创 2020-02-18 15:49:11 · 314 阅读 · 0 评论 -
C++11的final和overrid关键字
final主要又两个作用:1)class ClassName final ... 这个关键字可以防止 类被继承2)virtual void FunctionName()final... 也可以防止子类来重写从父类继承来的虚函数(再父类的函数声明后加上即可)override的作用1)防止粗心大意,是程序员总会有粗心的时候,比如函数名字写错了,当你要重写父类的虚函数时,加上这个关键字...原创 2020-02-18 15:38:48 · 287 阅读 · 0 评论 -
C++的虚函数表
先来看看代码弄清楚继承关系,我写的代码 结论的前两个都是验证正确的,由于结论三相比之下比较复杂,我就把结论三的代码和运行结果分享一下 ,结论一和结论二的代码注释掉了#include <iostream>#include <string>#include <Windows.h>#define NUMBER 3using namespace std...原创 2020-02-18 15:27:59 · 145 阅读 · 0 评论 -
C++的错误位
/************************************************* *eofbit是否到文件尾部 *failbit是可以挽回的错误,一种软件错误 *badbit是一种不可挽回的错误,一种硬件的错误或OS底层的错误 **************************************************/假如...原创 2019-11-12 16:39:41 · 161 阅读 · 1 评论 -
C++的IO
C++提供三种标准的IO(输入输出)1.从标准设备IO(显示器,键盘之类的)2.从文件进行IO3.从存储变量进行(stringstream/istringstream/ostringstream)首先我们先来看看C++提供的IO类的继承关系图(本人画图不好,懂那个意思就行了)来看看流的概念(其实就把它当成一种管道(水管之类的))我们直接从文件IO开始把// 文件流:...原创 2019-11-12 16:28:24 · 292 阅读 · 2 评论 -
查找算法之巅-位图算法
典型的用空间换时间的算法 哈希池(HashTable)也是如此话不多说先来看看原理:用二进制来表示某个数是否存在,存在为1, 不存在为0代码实现:#include <iostream>#include <time.h>#include <Windows.h>using namespace std;// 这里我们进行初始化// 初...原创 2019-11-06 20:26:05 · 330 阅读 · 2 评论 -
用虚继承解决多重继承造成的问题
首先我们先来看看多继承到底会造成什么问题:我是简化写的没有加功能,就是希望大家能更明了的理解,有问题的代码:#include <iostream>#include <string>#include <Windows.h>using namespace std;class Tel{public: Tel() { this-&g...原创 2019-11-05 19:22:05 · 281 阅读 · 0 评论 -
C++11新增的四种强制类型转换
C++四种强制类型转换在C++语言中新增了四个关键字static_cast、const_cast、reinterpret_cast和dynamic_cast。新类型的强制转换可以提供更好的控制强制转换过程。static_caststatic_cast用于将一种数据类型强制转换为另一种数据类型。int a = 7;int b = 3;double result = static...原创 2019-10-31 17:30:48 · 1798 阅读 · 1 评论 -
C++的联编和虚函数的使用
联编的定义:将源码中将函数调用解释为特定的函数代码块称为函数名联编静态联编(static binding):由于函数重载的缘故,编译器需要根据函数名和相应的参数进行选择,来执行相应的函数版本。编译器在编译过程完成这种联编,这种在编译过程中的联编称为静态联编。又叫早期联编。动态联编:编译器必须生成能够在程序运行时选择正确的虚方法的代码,这种联编称为动态联编。又叫晚期联编。我给大...原创 2019-10-31 16:58:48 · 155 阅读 · 0 评论 -
HashTable实现基因检测
HashTable实现基因检测,在有的场景下索引效率比红黑树还要高我们先来看看代码,模拟实现#include <iostream>#include <string>#include <assert.h>#include <Windows.h>using namespace std;static int DeBug = 1;#...原创 2019-10-30 17:08:59 · 178 阅读 · 2 评论 -
哈希表的企业级运用=》淘宝分布式文件系统TFS
项目背景介绍根据淘宝 2016 年的数据分析,淘宝卖家已经达到 900 多万,有上十亿的商品。每一个商品有包括 大量的图片和文字(平均:15k),粗略估计下,数据所占的存储空间在 1PB 以上,如果使用单块容 量为 1T 容量的磁盘来保存数据,那么也需要 1024x1024 块磁盘来保存.注意并不是把一块一块的硬盘放在一起就可以组成容量大的内存的,小型机做处理,了解一下 EMC.一...原创 2019-10-29 16:45:22 · 198 阅读 · 1 评论 -
C++多重继承的解决方法
二义性的产生简单的代码演示#include <string>#include <sstream>#include <iostream>#include <Windows.h>using namespace std;class Father{public: Father(const char* x, const char...原创 2019-10-29 13:33:37 · 441 阅读 · 0 评论 -
子类对象,向上强制类型转换
#include <iostream>#include <string>#include <Windows.h>using namespace std;class A {public: A(const char* str){ cout << __FUNCTION__ << endl; name = str; ...原创 2019-10-28 17:06:24 · 161 阅读 · 0 评论 -
HashTable的代码实现
#include <iostream>#include <string>#include <assert.h>#include <Windows.h>using namespace std;#include <cstdlib> //*#include <crtdbg.h> //*#ifdef _D...原创 2019-10-27 21:16:28 · 350 阅读 · 0 评论 -
read和write的陷阱(很隐晦的)
首先我们先来了解一下系统调用的概念和CPU和RAM为什么先讲这些呢,因为read和write函数如果要从一个磁盘里读信息,或者写一个信息到磁盘的文件都是会经过RAM的,一般再RAM上停留的时间为5-7分钟,如果再这个时间段里,服务器因为负载过高(宕机了)(这个现象是非常多见的:比如再八卦一波:在鹿晗宣布恋情的时候新浪的服务器3-4天了宕机了好多次)。所以再这信息停留再 RAM的时间段里...原创 2019-10-26 12:01:04 · 939 阅读 · 1 评论 -
其他的画图核心代码实现
由于一个截图一个一个演示太麻烦啦 我直接把核心的代码给大家,按照上一篇划线的步骤,大同小异的做就可以做出来了5.4 画刷(填充作用) CBrush brush(RBG(255,0,0)); CClientDC dc(this); dc.FillRect(CRect(起点,终点), &brush); 5.4.1 位图画刷 CBitmap bitmap; bitm...原创 2019-10-26 11:23:02 · 153 阅读 · 0 评论 -
MFC划线
5. 简单绘图 5.1 画线 • 知识点– 屏幕坐标点 – 设备上下文(Device Content, DC)– 事件 • 起点和终点 – 如何捕捉这 2 点? 鼠标左键按下:起点, 鼠标左键抬起:终点 – 点如何表示:CPoint这里我们再创建MFC项目时,用基于单文档的模式首先我先推荐一个VS屎丢丢的好用的MFC开发工具 点击项目->类向导在这...原创 2019-10-26 11:00:17 · 195 阅读 · 0 评论 -
listen函数和解析
头文件 #include <sys/socket.h>int listen(int sockfd, int backlog);此函数是把一个主动套接字(客户端的套接字,主动来连接服务器端),转换成一个被动套接字(由服务器端的内核来接受它的连接请求)成功返回0, 失败返回-1;第一个参数为socket函数返回的一个文件描述符。重点在第二个参数 backlog。我们先...原创 2019-10-25 21:17:59 · 837 阅读 · 0 评论 -
bind函数和解析
#include <sys/socket.h>int bind(int sockfd, struct sockaddr* servaddr, socklen_t len);此函数用于把某个本地协议地址赋予给套接字。成功返回0, 失败返回 -1.这张图的意思就是并不是非要指定ip和端口号。这是对于客户端来说的 ,服务器端就必须调用bind,不然别的用户都找不到你这...原创 2019-10-25 20:35:08 · 2509 阅读 · 2 评论 -
vs2019的MFC的环境搭建
2. MFC 开发环境搭建 • visual studio 2019 社区版 • help viewer (MSDN library) 工作负载点击单个组件找到 help view选上,以便查找API和响应的参数信息组件列表像这样就可以开始装了。...原创 2019-10-22 16:25:56 · 3376 阅读 · 0 评论 -
什么是MFC,为什么要学MFC
MFC 是什么 Microsoft Foundation Classes,是微软公司提供的类库,以 C++类的形式封装了 Windows API,也是一个应用程序框架,用以减少应用程序开发人员的工作量那框架又是什么? 来形象的描述一下总的来说框架相当于生成机器,生成效率高(开发效率高),而一行一行手写代码就和很多人包饺子一样(开发效率低)。API 与 SDK A...原创 2019-10-22 16:17:58 · 1706 阅读 · 0 评论 -
进程和线程的主仆问题
原创 2019-10-21 21:42:53 · 110 阅读 · 0 评论 -
read和write的陷阱和解决方案
正如上面的显示,,如果你想读或者写 800个字节 ,但是高速内缓存,只有400个字节的存储空间,所以你就会读取或者写不到后面剩下的400个字节,反复的从那个未读入的字节开始读取,(其实私底下操作系统是这么干的)等高速内缓存有多余的空间的时候,就调用realloc函数,把原先以读取的先复制过来,在开辟一段多余的空间存未读取的部分,把原来的那个末端的部分销毁掉。read和write继续重复...原创 2019-10-20 16:05:23 · 975 阅读 · 0 评论 -
线程池的原理
再Windows操作系统中是有线程池的,不需要人去写,但是再UNIX系统中没有线程池的概念所以需要人为的去写线程池包含这样几个概念,一个任务队列,互斥锁,和环境变量,还有很多线程1:由任务队列通向线程的这条路上,同时只能有一个任务,线程接受这个任务后处于执行状态,互斥锁锁上,就和上厕所一样一个坑进去一个人就把门关上,不能再进了。之后并对信号量执行P操作(就是减一,前提是信号量 ...原创 2019-10-20 15:20:48 · 121 阅读 · 0 评论 -
红黑树原理和构建红黑树
红黑树是一种二叉搜索树 有红节点和黑结点 同时又是一种自平衡得二叉搜索树 (但是是一种弱平衡,插入删除查找可以采用这种数据结构),意思就是说如果结点数目一样。红黑树得高度会 >= 平衡二叉树得高度。二叉搜索树有得特点 ,红黑树都有。同时还会加上这几个特点:1:结点是红色 或者黑色2:所有得叶子结点都是黑结点(NULL)3:根节点必须是 黑色结点4:红节点子结点...原创 2019-10-20 14:12:34 · 386 阅读 · 1 评论 -
探讨一下新的协议SCTP协议
SCTP协议:流控制传输协议 。同TCP 协议的有相同之处,同样是全双工通信的协议。并同样像TCP一样 提供流量控制,排序,可靠的传输SCTP 与 TCP 不同的是 :1:SCTP是面向消息的:2:与UDP 一样 每条发送的长度 都会随数据一道 发送到接收端3:SCTP 中用多个流 并行传输 , 一个流被阻塞了不会影响其他流的传输4:SCTP还提供了多宿性,使得单个 S...原创 2019-10-19 17:05:29 · 253 阅读 · 0 评论 -
socket函数的参数和解释
头文件 #include <sys/socket.h>int socket(int family, int type, int protocol)一个进程必须做的事情就是调用 socket 函数 指定期望的通信协议类型。该函数返回一个文件描述符 就是 sockfd 。用于本进程的 套接字通信 本进程结束 才释放 (close(sockfd)),如果不指定第三个参数...原创 2019-10-19 16:47:52 · 2346 阅读 · 0 评论