C++
北极光的征兆_liekkas
这个作者很懒,什么都没留下…
展开
-
vs2015使用 Boost
https://blog.csdn.net/misterfm/article/details/79048594原创 2021-01-29 11:16:54 · 173 阅读 · 0 评论 -
c++ 栈溢出简介
一、栈是用来做什么的呢? 整个内存都是用来存储数据的,栈也不例外。栈用来存储程序的局部数据。 对于C/C++来说,局部数据是指在函数内部定义的数据,例如在函数内部定义的变量、指针、参数、结构体、数组、对象、引用等,它们都要保存到栈中。 与之相对应的,在函数外部定义的变量、指针、对象、结构体、数组等都是全局数据,它们要保存到全局数据区。 而 malloc( )、new、new[ ] 是在程序运行的过程中动态地分配内存,这些内存都位于堆区。二、栈为什么会溢出 对每...原创 2021-01-20 14:05:42 · 1851 阅读 · 0 评论 -
智能指针shared_ptr
一、 原理 :RAII 资源获取即初始化技术原理:接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈上的变量自动被销毁,智能指针内部保存的内存也就被释放掉了(除非将智能指针保存起来)。为什么这么6呢?在传统 C++ 中,『记得』手动释放资源,总不是最佳实践。因为我们很有可能就忘记了去释放资源而导致泄露。所以通常的做法是对于一个对象而言,我们在...原创 2020-02-05 11:01:25 · 136 阅读 · 0 评论 -
设计模式(四)工厂方法模式 C++
工厂方法介绍意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决:主要解决接口选择的问题。何时使用:我们明确地计划不同条件下创建不同实例时。如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。关键代码:创建过程在其子类执行。应用实例:1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来...原创 2020-01-28 10:27:59 · 267 阅读 · 0 评论 -
C++ 简单工厂(静态工厂方法)
定义:定义一个工厂类,他可以根据参数的不同返回不同类的实例在简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法(Static Factory Method)需要什么,只需要传入一个正确的参数,就可以获取所需要的对象,而无需知道其实现过程假设有一个工厂,他能生产出A、B两种产品。当客户需要产品的时候一定要告诉共产是哪种产品,是A还是B。当新增...原创 2020-01-27 17:19:20 · 1022 阅读 · 1 评论 -
C++跨平台定时器
自己简单封装了下#include<iostream>using namespace std;#ifdef WIN32 // win#include <synchapi.h>#define SAFE_SLEEP(x) Sleep(x*1000)#else#include <unistd.h>#define SAFE_SLEEP(x) sle...原创 2020-01-20 13:57:36 · 596 阅读 · 1 评论 -
设计模式(二)职责链模式 C++
行为型设计模式一共有12个,下面介绍下第一个:职责链模式,它是对象行为型模式一、意图: 职责链模式:使得很多对象都有机会处理请求,从而避免请求发送者和接收者之间的耦合关系。将这些对象形成 一条链,沿着这条链处理请求,之道有一个对象处理为止二、适用性: 1、使得多个对象可以处理同一请求,对象请求顺序可自行确定 2、不明确指定接收者的情况,也就是不知道谁来处理请求的情况下...原创 2020-01-14 07:33:07 · 169 阅读 · 0 评论 -
C++ socket 阻塞IO,(服务器和客户端)
我所记录的是Windows下的Sosket阻塞通信方式阻塞IO注意两个点:1、#include <winsock2.h>一定要在#include <windows.h>之前,否则会报错。2、客户端和服务器缓存区大小需要保持一致才能够进行数据传输开发环境vs2015服务器端//MiNetService.h#pragma once#includ...原创 2020-01-05 15:27:39 · 471 阅读 · 0 评论 -
qt根据不同的操作系统引用不同的库文件
qt 程序#ifdef Q_OS_WIN32 // win #include <synchapi.h>#else #include <unistd.h>#endif原创 2019-12-31 14:59:45 · 530 阅读 · 0 评论 -
简单解释下内存碎片
对于内置的类型,malloc和new的作用是相同的,分配的都是连续的空间。首先申请了一块大小为5的内存,命名为A,接着申请了大小为10的内存,命名为B 。现在我释放了A,再申请20个内存块。由于之前A的内存块不满足要求,那么就只能在B后面申请。如果接下来申请的内存都大于5呢???那么A位置的内存就永远用不上,造成浪费参考https://blog.csdn.net/u012...原创 2019-12-29 10:45:04 · 158 阅读 · 0 评论 -
C11 锁
1.mutex 头文件是<mutex>,mutex是用来保证线程同步的,防止不同的线程同时操作同一个共享数据。但是使用mutex是不安全的,当一个线程在解锁之前异常退出了,那么其它被阻塞的线程就无法继续下去。用法:lock()unlock2.std::lock_guard 使用lock_guard则相对安全,它是基于作用域的,能够自解锁,当该对象创建时,它会...原创 2019-12-22 15:30:42 · 397 阅读 · 0 评论 -
qt 去掉标题栏
this->setWindowFlags(Qt::FramelessWindowHint);原创 2019-12-02 14:40:13 · 440 阅读 · 0 评论 -
undefined reference to `vtable for
QT通过信号与槽机制来实现通信的功能。当该类派生自QObject并且在头文件中添加Q_OBJECT宏以后,就可以使用信号与槽。 信号与槽之间可以进行通信的根本原因是:当在类的头文件中添加Q_OBJECT以后QtCreator会自动的创建一个moc_***.cpp文件,用于实现信号与槽通信的代码。但是,有时当我们通过QtCreator创建类的时候,没有通过IDE选项选择其派生自...转载 2019-11-25 16:31:46 · 125 阅读 · 0 评论 -
null和""
const char* pszValue = ""; // 空字符串,'\0'; 这个时候 '\0' == pszValue[0]const char* pszVec = pszValue = NULL; // 空指针,不指向任何地址//所以对于字符串判空可以这么做bool CharIsNull(const char* pszChar){ if ((!pszChar) || (p...原创 2019-10-29 20:39:54 · 252 阅读 · 0 评论 -
const 在函数前后的不同意义
const1、在函数名后面表示是常成员函数,该函数不能修改对象内的任何成员,只能发生读操作,不能发生写操作2、在函数前面,返回值不可修改原创 2018-12-02 17:29:35 · 536 阅读 · 0 评论 -
不同含义的new delete
new\delete1、new oprator要完成的两部分<1>分配内存,有oprator new 来做<2> 调用构造函数初始化内存中的对象2、oprator new作用;返回未处理的指针和未初始化的内存原型 :void * operator new(size_t size);重载全局的oprator new<1>void* operato...原创 2019-01-22 16:23:05 · 170 阅读 · 1 评论 -
重载、覆盖、隐藏
重载、覆盖、隐藏1 C++重载的发生条件参数列表不同:(参数个数、顺序、类型)2 extern“C”处理3 隐式类型转换导致重载函数产生二义性void output(int x){ cout &lt;&lt; " output int " &lt;&lt; x &lt;&lt; endl;}void output(float x){ cout &原创 2019-01-22 15:16:37 · 226 阅读 · 0 评论 -
守护进程
(一)、基本概念1、守护进程是脱离于终端并且在后台运行的进程 。 守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断 。2、守护进程是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。 守护进程常常在系统引导装入时启动,在系统关闭时终止2、大多数服务是通过守护进程实现的3、守护进程能...原创 2018-12-11 15:20:49 · 186 阅读 · 0 评论 -
多线程同步之读写锁
对于多线程程序来说,同步是指在一定的时间内只允许某一个线程访问某个资源 。 而在此时间内,不允许其他的线程访问该资源。同步资源的方式:互斥锁、条件变量、读写锁、信号量。读写锁:一、基本原理1、读写锁的 3 种状态1)当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞。(写锁,阻塞后面的其它读写锁操作)2)当读写锁在读加锁状态时,所有试图以读模式对它进行...原创 2018-12-10 20:10:05 · 354 阅读 · 0 评论 -
多线程同步之信号量
对于多线程程序来说,同步是指在一定的时间内只允许某一个线程访问某个资源 。 而在此时间内,不允许其他的线程访问该资源。同步资源的方式:互斥锁、条件变量、读写锁、信号量。信号量和互斥锁的区别: 互斥锁只允许一个线程进入临界区,而信号量允许多个线程同时进入临界区信号量。一、基本原理信号量和互斥锁的区别:互斥锁只允许一个线程进入临界区,而信号量允许多个线程同时进入临界区。以一个停车场的运作...原创 2018-12-10 19:58:19 · 957 阅读 · 0 评论 -
多线程同步之条件变量
对于多线程程序来说,同步是指在一定的时间内只允许某一个线程访问某个资源 。 而在此时间内,不允许其他的线程访问该资源。同步资源的方式:互斥锁、条件变量、读写锁、信号量。条件变量的理念:当线程在等待满足某些条件时使线程进入睡眠状态,一旦条件满足,就唤醒因等待满足特定条件而睡眠的线程#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#inc...原创 2018-12-10 15:11:12 · 462 阅读 · 0 评论 -
多线程同步之互斥锁
对于多线程程序来说,同步是指在一定的时间内只允许某一个线程访问某个资源 。 而在此时间内,不允许其他的线程访问该资源。同步资源的方式:互斥锁、条件变量、读写锁、信号量。下面介绍下互斥锁// 多线程同步、示例10// 互斥锁同步资源,模拟火车售票系统#include&amp;amp;lt;stdio.h&amp;amp;gt;#include&amp;amp;lt;stdlib.h&amp;amp;gt;#include&a原创 2018-12-10 15:02:17 · 339 阅读 · 0 评论 -
vim按下tab按键空4格
vi /etc/vim/vimrc 设置t ts=4ts=4是对的。但是由于我的配置是ts = 4 两个空格的原因,导致配置无效这个问题我查找很长时间。最终找到原因,也没有往常那种喜悦感,因为我本意并不是Vim,而是用vim看代码,只是觉得按下tab按键一下空8个格很不舒服。于是开始百度找答案。浪费大量时间不说,也没有心情看代码了。实际上更好的做法是,在Windows下面,选择一个自己喜欢的...原创 2018-12-06 22:00:18 · 1031 阅读 · 0 评论 -
网络IO模型之select基础
思考:为什么线程开销会大一、IO 有两种操作,同步 IO 和异步 IO 。 同步 IO 指的是,必须等待 IO 操作完成后,控制权才返回给用户进程 。 异步 IO 指的是,无须等待 IO 操作完成,就将控制权返回给用户进程。网络中的 IO ,由于不同的 IO 设备有着不同的特点,网络通信中往往需要等待 。 常见的有以下 4 种情况 。 (1)、输入操作 ...原创 2018-12-03 20:54:22 · 326 阅读 · 0 评论 -
TCP入门基础
一、基本概念流套接字(SOCK_STREAM):流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。数据报套接字(SOCK_DGRAM):数据报套接字提供了一种无连接的服务。该服务并不...原创 2018-12-01 13:24:22 · 193 阅读 · 0 评论 -
C++ 悬垂指针
/***********************************************************************// 一、迷途指针(悬垂指针)在计算机编程领域中,迷途指针与野指针指的是不指向任何合法的对象的指针。当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称迷途指针(悬垂指针)。/...原创 2019-03-28 16:20:28 · 436 阅读 · 0 评论 -
C++拷贝构造函数详解
一. 什么是拷贝构造函数首先对于普通类型的对象来说,它们之间的复制是很简单的,例如:[c-sharp] view plain copyint a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。转载 2016-03-22 23:57:36 · 398 阅读 · 0 评论 -
C++类模板
用代码说话// DealInner.h 从而报错#pragma once#include <iostream>using namespace std;template <typename Company>class MsgSender{public: // 类外构造的话,可能会因为不知道Company的类型,而不确定给对象分配多大的内存 MsgSe...原创 2019-07-22 20:16:42 · 97 阅读 · 0 评论 -
C指针之三:指针和函数
本文相关https://blog.csdn.net/joekepler/article/details/80393790指针和函数打交道的两个地方1、指针做参数2、函数指针一、程序的栈和堆1、程序栈2、栈帧的组织(一)、程序栈1、程序栈是支持函数执行的内存区域2、栈帧包含 返回地址 局部变量存储 函数参数存储 栈指针和基指针。栈指针指向栈帧的顶部,基指针指向栈帧内部元素的地址...原创 2019-07-05 14:45:48 · 248 阅读 · 0 评论 -
应用程序无法正常启动0xc000007b
应用程序无法正常启动0xc000007b这种问题主要是分为两种情况:一、缺少系统动态库二、准备启动的程序缺少第三方动态库(一)、对应第一大类问题缺少系统库,在虚拟机里比较常见,比如我新建了一个虚拟系统,Win7,然后把本机程序拷贝过去运行,这个时候虚拟机提示错误"应用程序无法正常启动0xc000007b"缺少系统动态库的原因大概是如下3个:1、电脑没有安装DirectX9或者Di...原创 2019-06-28 13:47:05 · 4419 阅读 · 0 评论 -
DLL的入口点函数
一、基本介绍系统在不同的时候调用这个入口点函数,这些调用是通知性质的,用来执行一些与进程或者线程有关的清理工作。如果DLL需要这些通知,则需要在源代码中实现这个入口点函数。注意函数名区分大小写 DllMain函数原型BOOL WINAPI DllMain(In HINSTANCE hinstDLL,In DWORD fdwReason,In LPVOID lpvRe...原创 2019-07-01 20:27:35 · 2425 阅读 · 0 评论 -
动态库和静态库
一 静态库:函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件。即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编...原创 2019-07-01 16:35:41 · 105 阅读 · 0 评论 -
C++ MySQL 连接池
应用场景:在对数据库进行操作的时候,需要经历以下步骤:1、建立连接2、打开数据库3、操作数据库4、关闭连接数据库连接是一种关键的有限的昂贵的资源,一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的性能低下。数据库连接池的解决方案是在程序启动的时候,建立一定数量的连接,组成连接池,(简单说:在一个“池”里放了好多半成品的数据库...原创 2019-06-21 17:40:51 · 979 阅读 · 0 评论 -
epoll笔记
int epoll_create(int size);creates a new epoll instance andreturns a file descriptor referring to that instance创建一个新的epoll实例,并且返回一个描述符指向这个实例参数:size,内核要监听的数目int epoll_ctl(int epfd, int o...翻译 2019-05-31 18:05:07 · 126 阅读 · 0 评论 -
函数模板demo
关于函数模板的使用,需要注意的是,类中的函数模板,定义和实现必须在同一个文件中,不然会出问题#pragma once#include <vector>//class Agorithm{public: Agorithm(); ~Agorithm();public: // 交换数值 template<class T> static void Sw...原创 2019-06-05 16:13:47 · 1022 阅读 · 0 评论 -
洗牌算法:打乱数组内部顺序
template<class T>inline void DomainFiveArena::RandArray(std::vector<T>& v){ size_t iCount = v.size(); for(size_t i = 0;i < iCount;i++) { int iRandNum = rand() % iCount; T t...原创 2019-06-05 10:08:42 · 323 阅读 · 0 评论 -
VS2017编译调试Ubuntu代码
1、Ubuntu需要输入的命令apt install -y zipapt install -y gdbapt install -y openssh-serverapt install -y build-essential gdbserver2、vs2017需要的配置工具–>获取工具和功能->安装使用C++的Linux开发完成安装3、建立工程,在编译的时候,会提示远程连...转载 2019-05-30 19:30:00 · 953 阅读 · 0 评论 -
C++ 前置声明
特点:被声明的类不用重新编译,节省编译时间比如A包含一个指向B的指针,B包含A的一个实例,这种情况下,使用前置声明。易错的点class Date; class Task1 { public: Date d; }; 因为分配器为d分配内存的时候,必须要知道 d的大小主要应用场景是两个头文件相互包含的场景,建议仅将前置声明用于解决循环引用问题。(头文件并不参加...原创 2018-11-26 19:04:01 · 294 阅读 · 0 评论 -
拷贝构造函数(深拷贝)示例
#include <iostream>#include <string>using namespace std;class Student{public: Student(string name = "", int age = 0, float score = 0.0f); //普通构造函数 Student(const Student &...原创 2018-11-29 20:13:16 · 824 阅读 · 0 评论 -
const在函数前面或者函数的作用
const1、在函数名后面表示是常成员函数,该函数不能修改对象内的任何成员,只能发生读操作,不能发生写操作2、在函数前面,返回值不可修改原创 2018-11-25 11:49:08 · 1311 阅读 · 0 评论