C++知识整理
在使用C++的过程中,碰到了的一些知识,以及相关的原理和经验分享~
灰子学技术
10年+后端开发工程师,8.5年+C++开发,2年Go开发经验。
公众号: 灰子学技术
架构知识文章 25篇+:
Go语言文章40篇+:
算法篇40篇+:
展开
-
weak_ptr一个配合shared_ptr的智能指针
一、产生原因weak_ptr的产生,主要是为了配合shared_ptr的使用,对于shared_ptr来说,有一种循环引用会导致shared_ptr的引用计数一直不能变为0,如此以来导致...原创 2020-11-26 19:00:00 · 387 阅读 · 0 评论 -
unique_ptr一个会转移数据的智能指针
一、产生的原因:unique_ptr的产生,就是为了解决,raw pointer 的new和delete配对使用问题。对于raw pointer来说,在new了之后,在delete之前往...原创 2020-11-24 13:26:34 · 1382 阅读 · 2 评论 -
shared_ptr一个不需要释放内存的智能指针
一、产生的原因shared_ptr的产生与unique_ptr类似,都是为了解决raw pointer的new和delete的成对使用,导致的野指针、内存泄漏、重复释放内存等。不过sha...原创 2020-11-25 07:00:00 · 5158 阅读 · 0 评论 -
连接字符串的函数
strcat(连接两字符串) char *strcat (char *dest, const char *src );strcat()会将参数src字符串拷贝到参数dest所指的字符串尾。第一个参数dest要有足够的空间来容纳要拷贝的字符串。该函数返回参数dest的字符串起始地址(strcat函数要求dest参数原先已经包含了一个字符串,该字符串可以是空字符串。它找到这个字符串的末尾,并原创 2010-02-03 20:17:00 · 30816 阅读 · 0 评论 -
【C++】几种类型的new介绍
现在的C++中,New有三种典型的使用方法,对应于下面三种格式。1.new : 普通的new操作,一旦内存分配失败,直接抛出一个异常,需要用catch来处理这种异常信息。2. new(nothrow) : 不抛出异常的new操作, 一旦内存分配失败,禁止抛出异常,而是返回一个NULL,可以通过判断指针是不是NULL来处理这种异常。3. placement new : 直接复...原创 2020-01-31 09:00:00 · 1974 阅读 · 0 评论 -
【C++】Class中的属性和方法是如何存储的
内容介绍: 在C++中对于一个Class,它内部的数据和方法到底是如何存储的呢?是将数据和方法都存储到Class的单个对象中呢,还是会将数据和方法分开来存储?如下图所示:答案是图2,每个对象占用存储空间的只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分),函数代码属于公用部分,所以在Class的存储中,将数据部分与对象关联,函数部分则是存储在一个公共的地方。 代码...原创 2020-02-02 09:00:00 · 972 阅读 · 0 评论 -
【C++】引用&详解
这篇文章只想谈谈,引用的特性,不打算介绍引用的使用情况。对于引用的重点,如下所示:引用&初始化的时候便于某一个变量绑定了,在此之后都是这个变量的别名,绑定关系不会改变。这里面有两个重点,一个是绑定,一个是别名,一旦绑定关系确定之后,便不会在改变,以后的使用只是作为别名来使用。例子如下所示:1.引用&初始化的时候,必须要与另外一个变量建立绑定关系。2.一...原创 2020-02-03 09:00:00 · 190 阅读 · 0 评论 -
关于内存相关的pagefault--好东西,要转载
转载时请注明出处和作者联系方式:http://blog.csdn.net/mimepp作者联系方式:YU TAO 这里记录一下使用valgrind查找你的应用程序中的各种潜在的错误信息,并举例说明。经常使用valgrind查找一下你的代码的内存有关错误,对移植到嵌入系统后的系统稳定性来说有着重要的意义。usagex86 平台先编译你自己的应用程序命令行:转载 2015-05-06 10:53:34 · 560 阅读 · 0 评论 -
条件编译(#ifdef,#else,#endif,#ifndef,#else,#endif)
来自:http://hi.baidu.com/taney/blog/item/1a06abee1763d92a2df534b7.html最近在用C语写一些程序,发现#ifdef,#else,#endif和#ifndef,#else,#endif在UCOS-II中有大量的应用,于是到网上查了一些相关的解释.#ifdef的用法灵活使用#ifdef指示符,我们可以区隔一些与特定头转载 2010-03-25 16:21:00 · 1415 阅读 · 0 评论 -
Static详解
static 声明的变量在C语言中有两方面的特征:1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。Tips:A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;B.若全局变量仅原创 2010-02-03 19:51:00 · 596 阅读 · 0 评论 -
C++ new/delete 与 new[]/delete[] 详情
new operator: A* pA = new A(); When we use thenew operator,the steps are as follows:Step1: call operator newto allocate the memory as big as sizeof(A).Step2: call the constructor A()原创 2015-09-21 14:49:24 · 443 阅读 · 0 评论 -
static变量在Main函数之前执行分析(C++)
c/c++语言中,在执行main的入口函数之前,是会首先执行一段代码。而对于全局变量和static的初始化就是 在main函数之前执行的,例子如下:#include #include class static_name{public: static_name(){}; static int static_print();private:原创 2013-03-19 20:43:10 · 2392 阅读 · 0 评论 -
memset对数组赋初值探讨
一直认为对数组赋初值memset要比for语句要快,例如下两种方式:int i= 0;char cArry[10]={0};方式一:for(i=0;i{ cArry[i]=0xff;}方式二:memset(cArry,0xFF,sizeof(cArry));今天经过查看memset的反汇编,发现原来memset也是翻译成了for循环语句来进行赋值操作的原创 2012-08-23 18:47:54 · 1730 阅读 · 0 评论 -
优先级
如果即将被运行的进程的优先级比正在运行的进程的优先级高,则系统可以强行剥夺正在运行的进程的CPU,让优先级高的进程先运行。在 Windows 中,優先順序由 1 ~ 31 , 1 為最慢, 31 為最高,系統執行時依執行緒為基於程序之優先順序之混合運算後,得到系統中之優先順序,詳細混合運算量級表如下:系統優先順序程序優先順序類別執行緒優先順序等級1I原创 2010-02-22 13:34:00 · 3018 阅读 · 0 评论 -
不要轻视拷贝构造函数与赋值函数
来自:高质量c++编程指南 由于并非所有的对象都会使用拷贝构造函数和赋值操作符,程序员可能对这两个函数有些轻视。请先记住以下的警告,在阅读正文时就会多心: 本章开头讲过,如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。以类String的两个对象a,b为例,假设a.m_data的内容为“hello”原创 2010-02-05 14:26:00 · 634 阅读 · 0 评论 -
内存的三种分配方式
来自:高质量c++变成指南(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(3) 从堆上分配原创 2010-02-04 12:21:00 · 791 阅读 · 0 评论 -
构造函数析构函数的起源
中所有的语法问题,这的确帮了程序员的大忙。但是程序通过了编译检查并不表示错误已经不存在了,在“错误”的大家庭里,“语法错误”的地位只能算是小弟弟。级别高的错误通常隐藏得很深,就象狡猾的罪犯,想逮住他可不容易。 根据经验,不少难以察觉的程序错误是由于变量没有被正确初始化或清除造成的,而初始化和清除工作很容易被人遗忘。Stroustrup在设计C++语言时充分考虑了这个问题并很好地予以原创 2010-02-04 12:20:00 · 620 阅读 · 0 评论 -
Typedef相关概念
C语言支持一种叫做typedef的机制,它允许你为各种数据类型定义新的名字。typedef声明的写法和普通的声明基本相同,只是让typedef这个关键字出现在声明的前面。例如,下面这个声明:char *ptr_to_char;把变量ptr_to_char声明为一个指向字符的指针。但是,在添加了关键字typedef后,声明变为:typedef char *ptr_to_char;这个原创 2010-02-03 20:20:00 · 704 阅读 · 0 评论 -
array_name和&array_name的异同
前者是指向数组中第一个元素的指针,后者是指向整个数组的指针。char a[MAX]; /*array of MAX characters*/char *p = a; /*p为指向数组的指针*/ char *pa = &a; /*该语句是不正确的,pa的类型为char *,而&a的类型为char (*)[MAX]’*/char (*pb)[MAX] =原创 2010-02-03 19:59:00 · 1014 阅读 · 0 评论 -
慎用内联函数
内联能提高函数的执行效率,为什么不把所有的函数都定义成内联函数? 如果所有的函数都是内联函数,还用得着“内联”这个关键字吗? 内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。以下情况原创 2010-02-05 14:28:00 · 754 阅读 · 0 评论 -
返回整数的getchar函数
来自:C缺陷与陷阱5.1节我们首先看下面的这个例子:#include int main(){char c; /* 改成:int c 就正确了 */ while( ( c = getchar() ) != EOF ) { putchar( c ); } return 0;}原创 2010-02-03 20:24:00 · 1676 阅读 · 0 评论 -
查找字符/字符串的函数
strstr(在一字符串中查找指定的字符串) char *strstr( const char *s1, const char *s2 );strstr()会从字符串s1中搜寻字符串s2,并将第一次出现的地址返回。返回指定字符串第一次出现的地址,否则返回NULL(如果s1或者s2为空,在vc中编译没有问题,当时运行时会出现异常)。#include#include原创 2010-02-03 20:18:00 · 2737 阅读 · 0 评论 -
字符串拷贝和内存拷贝函数
strcpy(拷贝字符串) 定义函数:char *strcpy( char *dest, const char *src );strcpy()函数只能拷贝字符串。strcpy()函数将源字符串src的每个字节拷贝到目的字符串dest中,src字符串末尾的/0也被拷贝过去。strcpy()函数返回参数dest的起始地址。如果参数dest所指的内存空间不够大,可能会造成缓冲溢出(buff原创 2010-02-03 20:15:00 · 9405 阅读 · 0 评论 -
常见的动态内存错误
来自:c和指针.P223在使用动态内存分配的程序中,常常会出现许多错误。这些错误包括对NULL指针进行解除引用操作、对分配的内存进行操作时越过边界、释放并非动态分配的内存、试图释放一块动态分配的内存的一部分以及一块动态内存被释放之后还继续使用它。以下是一些需要注意的事项:1、在请求动态内存分配时,要检查所请求的内存是否成功分配。2、操作内存时,不要超过动态分配的内存的边界。对分配的内存之外的区原创 2010-02-03 20:11:00 · 574 阅读 · 0 评论 -
NULL和NUL的区别
NULL是在头文件中专门为空指针定义的一个宏。NUL是ASCII字符集中第一个字符的名称,它对应于一个零值。C语言中没有NUL这样的预定义宏。注意:在ASCII字符集中,数字0对应于十进制值48,不要把数字0和/0(NUL)的值混同起来。NULL可以被定义为(void *)0,而NUL可以被定义为/0。NULL和NUL都可以被简单地定义为0,这时它们是等价的,可以互换使用,但这是一种不原创 2010-02-03 19:54:00 · 5834 阅读 · 0 评论 -
不能被重载的运算符
在C++运算符集合中,有一些运算符是不允许被重载的。这种限制是出于安全方面的考虑,可防止错误和混乱。(1)不能改变C++内部数据类型(如int,float等)的运算符。(2)不能重载‘.’,因为‘.’在类中对任何成员都有意义,已经成为标准用法。(3)不能重载目前C++运算符集合中没有的符号,如#,@,$等。原因有两点,一是难以理解,二是难以确定优先级。(4)对已经存在的运算符进行重原创 2010-02-05 14:32:00 · 1434 阅读 · 0 评论 -
C和指针 的读书笔记(自己整理)
第2章 环境:翻译环境: 源代码转化成可执行的机器指令。执行环境:用于实际执行代码。翻译:源文件-〉目标文件-〉可执行文件(通过链接器将多个目标文件捆绑在一起)编译过程:预处理器-〉源代码经过解析产生目标代码(这个过程中是绝大多数错误和警告产生的地方)-〉优化器(就是对目标代码进行进一步优化,使效率更高)执行:首先,程序被加载到内存,那些不是存储在栈中的未被初始化的变量将在这个原创 2010-02-04 12:28:00 · 2938 阅读 · 0 评论 -
动态内存会被自动释放吗
来自:高质量c++编程指南函数体内的局部变量在函数结束时自动消亡。很多人误以为示例7-6是正确的。理由是p是局部的指针变量,它消亡的时候会让它所指的动态内存一起完蛋。这是错觉! void Func(void){ char *p = (char *) malloc(100); // 动态内存会自动释放吗?}示例7-6 试图原创 2010-02-04 12:24:00 · 1425 阅读 · 0 评论 -
使用const提高函数的健壮性
来自:高质量c++编程指南看到const关键字,C++程序员首先想到的可能是const常量。这可不是良好的条件反射。如果只知道用const定义常量,那么相当于把火药仅用于制作鞭炮。const更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多原创 2010-02-04 12:18:00 · 497 阅读 · 0 评论 -
= 不同于 ==
来自:c缺陷与陷阱1.1节当形如e1 = e2这样的表达式出现在语句的条件判断部分时,有些编译器会给出警告消息。当确实需要对变量进行赋值并检查该变量是否为0时,为了避免来自编译器的警告,我们不应该简单的关闭警告选项,而应该显示的进行比较。也就是说,下面的例子:if( x = y ) foo();应该改写为:if( ( x = y ) != 0 ){原创 2010-02-03 20:21:00 · 538 阅读 · 0 评论 -
malloc()、calloc()、realloc()
函数malloc()和calloc()都可以用来分配动态内存空间,但两者稍有区别。malloc()函数有一个参数,即要分配的内存空间的大小: void *malloc(size_t size); calloc()函数有两个参数,分别为元素的数目和每个元素的大小,两个参数的乘积就是要分配的空间的大小: void *calloc(size_t numElements,原创 2010-02-03 20:11:00 · 496 阅读 · 0 评论 -
强制类型转换相关概念
来自:c专家编程.P187.强制类型转换(cast)这个术语从C语言一诞生就开始使用,即用于类型转换,也用于消除类型歧义。可以很容易地把某种类型的数据强制转换为基本类型的数据:在括号里写上新类型的名称,然后把它们放在需要转化类型的表达式的前面。在强制转换一个更为复杂的类型时,可以采取如下的方法:1、 一个对象的声明,它的类型就是想要转换的结果类型;2、原创 2010-02-03 20:09:00 · 1402 阅读 · 0 评论 -
malloc/free 与new/delete 的区别
malloc/free 的使用要点 函数malloc的原型如下: void * malloc(size_t size); 用malloc申请一块长度为length的整数类型的内存,程序如下: int *p = (int *) malloc(sizeof(int) * length);我们应当把注意力集中在两个要素上:“类型转换”和“size原创 2010-02-03 20:29:00 · 607 阅读 · 0 评论 -
【C++】指针传递与函数返回详解
指针变量作为参数传递给函数的时候,编译器会将这个指针变量Copy一份,也就说在函数内部使用的这个参数变量,是另外一个指针变量。从程序的输出结果,可以看出fun()内部指针变量的地址,变成了另外一个数值。不过在fun()内部的这个指针变量所指向的内存位置并没有变化,在函数内部更改该内存位置的数值的话,fun()外部的指针变量a所对应的数值也会被改变。从程序的输出可以看出,...原创 2019-10-05 08:44:39 · 827 阅读 · 0 评论 -
【C++】private的作用范围是Class
为什么在一个class里面声明为private的变量,在这个class内可以被copy构造函数直接调用,并且还能够编译通过。作为C++工程师,一直没有好好思考这个问题,最近突然意识到这是一个很有意思的问题。索性做了下验证,原来我们平时所提到的public, protected, private修饰的是class,而不是class所对应的实例。这也就是说private 只要是在clas...转载 2019-10-01 10:16:31 · 1454 阅读 · 0 评论 -
【C++】指针与指针变量详解
我们来先看下指针和指针变量都是什么?1.指针指的是地址。2.指针变量,首先 它是一个变量,是变量就有地址,所以指针变量有自己的地址。其次 指针变量存储的值,是一个地址,这个地址可以是另外一个变量的地址,也可以是分配出来的堆的地址。从程序的输出可以看出,a, b, c都是指针变量,它们都有自己的地址,并且每个指针变量的地址并不相同。当a,b,c都赋值为nullptr的...原创 2019-10-02 10:42:00 · 838 阅读 · 0 评论