自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 收藏
  • 关注

原创 若容器中包含了new创建的指针,一定要在析构前delete掉

大多数情况下,STL会自动帮你析构,不需要你自己考虑善后工作。但是,当容器中包含的对象是new创建的指针时,就不正确了。如下面代码:void doSomething(){vector w1;for(int i=0;i{w1.push_back(new Widget);...}}上述代码会发生内存泄漏。vector容器只会把指向对象的指针析构掉,指针所

2017-10-03 21:33:00 628

原创 linux grep、find、locate、whereis、which几个查询指令简析

grep: grep 选项 pattern 文件名-b:显示块号-c 仅显示各指定文件中包含模式的总行数-i 模式中字母不区分大小写-h 不将包含模式的文件名显示在该行上-l 仅显示包含模式的文件名-n 显示模式所在行的行号-s 指定文件若不存在或不可读,不提示错误信息-v 显示所有不包含模式的行正则表达式在grep中的使用. 匹配所有字符* 匹配0个或

2017-09-28 10:01:37 171

转载 STL迭代器失效情况

vector与string有以下两种情况会使得迭代器失效1.若添加元素时,存储空间足够,没有重新分配,则end返回的迭代器失效;若存储空间不足,重新分配空间,则全部迭代器失效。2.删除元素时,删除点之前的迭代器有效,之后的迭代器失效。原因:vector与string是顺序存储 ,占用的是一块连续内存。插入与删除时,会导致元素移动或者重新分配空间。deque:插入元素会使迭代

2017-09-10 08:31:50 251 1

原创 常用网络协议及其端口

安全外壳协议(SSH)  端口22FTP  端口20、21Telnet 远程终端协议 23电子邮件/简单邮件传输协议 (SMTP) 25域名解析协议 (53)(HTTP/HTPS) 80、443交互式邮件访问协议 (IMAP/IMAPS) 389简单网络管理协议 (SNMP) 161、162轻量级目录访问协议(TLS) 389

2017-09-07 21:49:20 327

原创 浅谈gcc命令

gcc -E 让程序在预编译之后停止gcc -S 生成汇编指令gcc -o 与标准链接库相连,生成可执行文件gcc -I 指定程序要链接的库gcc -L 链接库所在路径gcc -Wall 所有警告都要提出来,程序会在警告的地方停下来,迫使程序员改代码。gcc -std 使用的标准gcc -pedantic 检验出错,但不是全部,只有ANSI/ISO C语言标准中要求进行

2017-08-30 09:25:45 225

原创 python的基本数据类型

python中的数的类型:1.整型2.浮点型3.复数python中的整型不区分 long int这种,默认是可以任意长的。字符串单引号:单引号可以指定字符串,如'hello' 表示hello 'hello world'则表示hello world 空格与制表符都原样保留双引号:与单引号相同三引号:之间可以放句子。如'''what\'s your name? I as

2017-08-25 21:45:44 218

原创 缓式评估、写时复制及引用计数的关系

缓式评估:将工作推迟到必须做时才去做。写时复制:写入的时候才将数据复制一份,即几个对象共享同一份数据,只有当其中一个对象有写入的动作时,才给该对象重新复制一份。(读是不改变数据的)写时复制采用的方法即为引用计数。写时复制是缓式评估的方法之一,而引用计数不但是写时复制的方法,也是缓式评估的方法之一。总结一下缓式评估的方法:1.引用计数。2.写时复制。3.缓式输出。4.

2017-08-23 11:29:23 175

原创 c++对象的三种存在形态

1.它作为类的对象本身,如:A a;a即是A的对象2.嵌入大的对象之中3.作为派生类的基类部分。

2017-08-09 23:31:08 209

原创 c++限制某个class所能产生对象数量的方法

1.产生零个或一个对象:将构造函数与拷贝构造函数声明为私有成员,并声明一个友元函数,在友元函数中声明一个静态成员,调用构造函数,并返回一个静态成员的引用。另一种方法就是设置一个计数器,初始化为0.在构造函数中+1,在析构函数中-1,每次保证只有一个对象。2.不同对象的构造状态:上述第二种方法在继承关系与嵌入大对象中时就会出现漏洞。假设有一个打印机的基类,它的派生类是一个彩色打印机,

2017-08-09 23:28:19 372

原创 c++将构造与非成员函数虚化的方法

虚函数拥有因类型而异的行为。而构造函数则是已经明确了对象,才调用的,所以,构造函数不能为虚函数,但是,我们可以通过一些方法使得构造函数可以有虚函数的功能。所谓的虚构造函数,是一种函数,视其获得的输入,可产生不同类型的对象。用途:如在从磁盘(或网络或磁带等)读取信息时。class A{                //抽象基类,内含虚函数public:..};class B

2017-08-07 23:16:38 249

原创 使用op=(复合形式)替代op(独身形式)的优点

考虑下面的类:class Rational{public:....Rational& operator +=(const Rational& rhs);Rational& operator -=(const Rational&lhs);};Rational& operator +=(const Rational& rhs,const Rational&lhs)

2017-08-06 23:01:02 323

原创 c++设计中可以利用重载避免隐式类型转换

首先,先看一个例子:class UPInt {public:UPInt();UPInt(int value);...}const UPInt operator +(const UPInt& object1,const UPInt& object2);UPInt object1,object2;UPInt object3=object1+object2;//调用o

2017-08-05 00:16:11 256

原创 c++临时对象的来源即成本

程序员往往把临时需要的变量称为 “临时变量”。如:templatevoid swap(T& object1,T& object2){T temp=object1;object1=object2;object2=temp;}temp 即临时对象,但是,在c++眼中,temp并不是临时对象,是一个局部对象。c++临时对象是不可见的,一般临时对象会在下面两种情况下产生

2017-08-04 10:29:01 141

原创 浅谈缓式评估技术的好处及方法

缓式评估也叫拖延战术,即把工作堆积到必须要做的时候才去做。缓式评估的方法:1.引用计数。如:string s1="hello";string s2=s1;如果s2并不改变值,我们就可以让s2共享s1的值,这样就不需要调用赋值函数。直到非调用不可时,再去调用,如果,到最后都没有调用,则就省去了这部分的开销。2.区分读和写:string s1="hello";cout

2017-08-03 00:35:44 273

原创 c++异常处理成本

1.程序必须在每一个执行点确认“如果发生异常,哪些对象需要析构”。2.必须对每一个try语句块的进入点和离开点做记号,还必须知道他们的异常类型和对应的catch。3.没产生一个exception specification,就相当于一个try语句块的消耗。所以,为了让exception的相关成本最小化,最好的方法(我认为)是:对try和exception specification 的

2017-08-02 00:08:56 208

原创 浅谈OSI模型的各个层次

主机:应用层:指定完成某些用户初始化任务的方法,应用协议通常由应用开发者设计和实现,如:http、ftp、Skype等。表示层:指定针对应用的数据格式和转换规则的方法。如:将字符转换成ascii码。会话层:指定由多个连接组成一个通信会话的方法。它可能包括关闭连接、重启连接和检查点进程。ISO X.255是一个会话层协议。传输层:指定运行在多个计算机系统中的多个程序之间的连接或关联的

2017-08-01 18:46:20 1458

原创 c++异常说明(exception specification)

所谓的异常说明即throw(int(异常说明))在实际应用中要明智使用异常说明原因:1.编译器有时候能够在编译期间侦测到与exception specification不一样的行为,假设抛出了一个并为列与其 exception specification的exception ,这个错误会在运行期间被检测出来,于是会调用unexpected函数,而unexpected会调用termi

2017-07-31 23:08:52 1601

原创 为什么最好以引用方式捕捉异常

捕捉异常的方式有三种:值传递、引用、指针引用与值传递相比:1.值传递会复制两次,传给catch时,抛出时都会复制。引用只复制一次,效率大大提高。2.值传递会带来切割问题。当传递派生类对象给参数是基类对象的catch时,会导致切割,即派生类的派生类成员被切割,只留基类的部分。引用与指针相比:1.抛出指针时,不需要复制对象,只需复制指针,效率增加,但是,不能抛出指向局部对象的指

2017-07-30 12:26:12 328

原创 抛出异常与传参数及调用虚函数之间的区别与联系

先来谈谈抛出异常与传参:联系:都有三种传递方式:值传递、引用、指针区别:1.传递参数,最终控制权会回到调用处。而抛出异常,则不会回到抛出处。2.传递参数所允许的隐式类型转换比抛出异常要多。异常只允许两种隐式类型转换::将基类转换成派生类对象,即可用捕捉派生类异常。   :将“有型指针”转换成“无形指针”。即catch(const void*..);可以捕捉任何指针类型的异常

2017-07-30 11:42:22 284

原创 不要让异常跑出析构函数

析构函数会在以下两种情况下被调用:1.对象正常释放时。2.当对象被异常处理机制传播过程中的stack_unwinding(栈展开)机制摧毁。但是,析构函数被调用时,可能会有一个异常正在作用。我们是无法区分这些状态的。我们必须假设这种情况发生,因为如果控制权基于异常的因素离开析构函数,而此时正有另一个异常处于作用状态,c++会调用terminate函数,结束程序。不要让异常跑出析

2017-07-29 21:34:05 292

原创 在构造函数中避免资源泄漏

c++析构函数不会析构没有构造好的对象,意思就是如果程序在构造对象时抛出异常,则析构函数不会析构此对象,导致资源泄漏。针对这种情况,就需要考虑在构造函数中将异常情况考虑。具体例子在more effective c++条款10.

2017-07-29 21:18:53 237

原创 c++设计中可以利用析构函数避免泄露资源

假设有这样一个函数B::virtual void fun(int i){while(i--){A* ptr=readdata(i);//其中A为抽象基类ptr->fun1();//假设fun1是A中的纯虚函数delete ptr;}}对于上面的代码,当ptr->fun1();出了异常,则程序永远不会delete ptr,造成资源的泄漏。要避免这一点,

2017-07-28 23:51:49 214

原创 c++抛出异常方式与C语言的区别

c++中,抛出异常采用的是try catch throw,而C语言使用的则是setjmp与longjmp 。C语言中setjmp是用来保存程序运行时堆栈环境,而longjmp是用来恢复先前程序中的setjmp所保存的堆栈环境。setjmp声明如下:int setjmp(jmp_buf envbuf);longjmp声明:void longjmp(jmp_buf envbuf,int v

2017-07-28 23:12:39 1237

原创 不要重载&& ||和,操作符

首先,我们来说一下为什么不要重载&&与||&&与|| 具有骤死式语意。即(在第一个条件为真时 || 即为真,不会判断第二个条件)假设你重载了&& 则当你调用的时候会出现这种情况if(a1 && a2)//a1、a2是重载了&& 的类对象则会变成这样if(a1.operator &&(a2));//operator &&是成员函数if(operator && (a1,a2))

2017-07-27 20:09:45 222

原创 浅谈c++placement new

placement new 存在于头文件,或者中。有些时候,你会想在指定的内存上面构造对象。这时就会用到placement new。它是一个特殊版本的operator new。例如:class Widget{Widget(int Widgetsize);...};Widget* constructWidgetInBuffer(void* buffer,int Wid

2017-07-27 19:33:22 379

原创 c++operator new/new operator、operator delete/delete operator的区别与联系

c++可以重载运算符,其中operator new/operator delete是可以重载的。但是,new operator与delete operator都是内建操作符,不能重载string* p= new s("aaaaaaa");上述语句调用的就是new operator,它执行了两步:1.调用operator new 为对象分配空间。2.调用构造函数进行初始化。区

2017-07-27 18:22:51 256

原创 c++类型转换函数的麻烦及解决方法

c++如同C语言一样, 有语言本身的隐式类型转换。如将char转换成int int转换为double等 c++还可以将double转换成int 即向下转换。这是语言本身提供的,我们不能控制。但是对于我们自己写的类却可以自己控制。有两种函数提供这种类型的转换:隐式类型转换操作符与单一变量构造函数。尽量不要提供这两种函数原因:1.对于隐式类型转换操作符:它可能在你不知道的时候就调用

2017-07-26 21:20:17 342

原创 c++可以重载与不可以重载的操作符

可以重载的有:() [] , operator new operator delete operator new[] operator delete[] + - * / += -= == > = % ->* ~ != ++ -- && || ^= &= |= >= > /= *= %=不能重载的操作符:?:  :: . .*

2017-07-26 19:54:10 193

原创 浅谈c++无参构造

无参构造即在没有任何外来信息的情况下对对象进行初始化。对于有些类来讲,有许多对象,没有外来信息,就没办法执行一个完全的初始化。如:设备仪器编号,若没有适当的编码,则对象就是无效的。没有无参构造带来的问题:1.没有办法为数组中的对象提供所需参数。如:A是一个没有无参构造的类A* aa=new A[10];//错误,没有声明无参构造。A a[10];//错误2.不适用于某些

2017-07-25 16:45:19 1746

原创 more effective c++条款总结

条款一:仔细区别 pointer(指针)和references(引用)。条款二:最好使用c++类型的转型操作符。条款三:绝不要以多态方式处理数组。条款四:非必要,不要提供无参构造。条款五:对定制的“类型转换函数”保持警觉。条款六:区别++/--操作符的前置和后置形式。条款七:千万不要重载&& ||和,操作符。条款八:了解不同意义的new和delete。条款九:利用d

2017-07-25 16:08:05 367

原创 不要以多态的方式处理数组

基类,派生类的sizeof不同。如果以多态的方式处理数组的话,就类似与int类型数组,却每次要移动sizeof(double)一样。基类与派生类大小不同,一般派生类比较大,当你传递一个派生类对象数组给一个参数是基类对象数组的函数时,Array[i],移动的距离就不在是i*sizeof(基类)了,就是i*sizeof(派生类)了。如:void printarray(ostream &

2017-07-24 22:20:43 498

原创 c++强制类型转换补充

c++要添加几种新式类型转换的原因:1.旧式的类型转换几乎允许将任何其他类型转换成你需要的类型,这是非常拙劣的。2.旧式的类型转换不容易辨识。c++的四种新的类型转换:static_cast:与旧式的类型转换功能一样,不可以在赋值类型不兼容的类型之间转换。如:将一个struct转换为int,或者将一个int 转换成指针pointer。const_cast:改变表达式中的常量

2017-07-24 22:07:17 166

转载 c++中static成员函数、成员变量作用

当函数的行为对所有的派生类都一致时,可以将其声明为静态成员函数。好处:1.可以实现某些特殊的设计模式。如:Singleton2.可以把某些系统的回调函数以静态函数的形式封装到类的内部。因为系统API的回调函数通常都是独立的,没有this指针。3.可以封装某些算法。4.静态函数不需要实例化就可以被调用,所以,一切不需要实例化就可以有确定行为方式的函数都应该封装成静态成员函数。

2017-07-23 16:23:12 283

原创 浅谈c++volatile关键字

volatile:是一种类型修饰符,它修饰的类型变量可以被某些编译器或者未知因素更改。如:操作系统、硬件、其他线程等。volatile可以与const同时使用。如 const volatile int i=0;const与volatile写在一起的意义是没有问题的。假如:只读的状态寄存器,它是volatile,因为它可能被意外改变;它是const,因为,程序不应该试图修改它。volat

2017-07-22 17:02:09 133

原创 c++四种强制类型转换

类型转换格式:类型装换(数据)如:static_cast(ch);1.static_cast:最安全的转换方式。主要用于基本类型之间与具有继承关系之间的转换。2.const_cast 用于const/volatile 与非const/volatile 之间的转换。可以用来去除指针变量的常量属性,也可以将一个非指针变量的指针变为指针变量。但是,无法将一个非指针的常量转换为一个变量。3

2017-07-22 16:40:17 154

原创 c++中new/delete与malloc/free的区别与联系

联系:1.返回的都是指向某一空间的指针。2.都是在堆上分配空间。区别:1.new会构造对象并调用构造函数初始化对象,而malloc只是分配一段空间。2.delete会调用析构函数释放对象,而free仅仅只是释放一段空间。总结:new/delete、malloc/free不要混用。且调用new和new[] 也要相应的调用 delete与delete[]。delete默

2017-07-21 20:28:30 203

原创 c++中将引用作为函数返回值需要注意的一些地方

1.不能返回局部变量的引用。局部变量是在栈里面创建的,函数调用完,就会被释放。引用所引用的地址就没有了。2.不能返回内部用new分配的内存的引用。因为new了之后,没有delete,所以,会导致内存泄漏。3.返回静态对象的引用要视情况而定。静态对象只初始化一次,如果有比较的出现,如if((a+b)==(b+c)),会导致条件一直成立。显然这并不是我们要的结果。返回引用的好处:可以实

2017-07-21 09:49:53 769

原创 引用作为函数与指针及值传递的差别

传引用与传指针的联系与区别:联系:传引用给函数与传指针效果是一样的,引用只是变量的一个别名。指针相当于保存了变量地址,间接操作对象。区别:1.使用引用不需要给形参分配空间,指针则需要给形参分配空间。2.在调用处,还是需要实参地址,并且在函数中国多处使用指针,也容易使人混淆,导致程序阅读性差。而引用则更容易理解。与值传递的区别:1.值传递需要为形参分配空间,引用不需要

2017-07-21 09:45:43 229 1

原创 c++引用与指针的区别与联系

引用:某个变量的“别名”,对用操作与直接操作变量是一样的。联系:引用本质上是一个指针。区别:1.引用必须初始化,指针可以不初始化。2.指针可以为NULL,引用不能为NULL。3.引用本身不占用内存空间,指针在32位系统中占4个字节,64位系统占8个字节。4.引用只能引用一个地址空间,指针则可以随便指。

2017-07-20 16:14:35 191

转载 确保非局部静态对象使用前被初始化

这种情况主要在于:一个对象的初始化要靠另一个对象的初始化。非局部静态对象:定义在全局或者名字空间范围内的对象在一个类中被声明为static的对象在一个文件范围内被定义为static。做法:可以返回局部静态对象的引用来达到初始化的目的。如:class A{public:A&  a_static(){static A a;return a;}

2017-07-19 17:01:09 213

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除