想要更深入的理解循环引用,请先浏览上一篇博客:智能指针

那么我先对我上一篇博客的主要内容,做一个简单的回顾把:

1、shared_ptr:引用计数

(1)不同类型的指针,销毁方式不同,此外我还实现了一个定制删除器:a、函数指针;b、仿函数:把一个对象像函数一样使用(在函数名字后面跟上参数列表)【A a;operator()(int); a(10);可以把a当作函数的名字,但是a是一个对象,实际上a相当于调用了()的重载,需要在A的类中对()函数调用运算符进行重载,重载之后把一个对象当作函数类型来使用】

(2)这种智能指针不支持多线程(多线程要考虑线程安全问题,需要给成原子操作)

(3)shared_ptr的缺陷:循环引用

             双向链表问题

(4)weak_ptr:弱智能指针:是为了解决shared_ptr中循环引用的问题而引入的,但是不能独立使用,没有这种类型的构造函数。weak_ptr必须和shared_ptr配合使用,实现原理相同,都是引用计数。不同之处:a、

shared_ptr可以独立的管理空间,而weak_ptr不行;b、发生sp1->_pNext = sp2;
    sp2->_pPre = sp1;这种赋值方式,shared_ptr增加了引用计数是use,如果是weak_ptr增加引用计数是weak.

(5)shared_ptr底层的实现原理

 销毁:

 2、在boost库中的实现原理:先进行编译,编译成特定的格式

将boost库的源码直接加入vs中的方式:项目--》属性--》属性配置---》c/c++---》常规----》符加包含目录---》编辑---》将源码的文件夹包含

链接---》常规---》符加库目录---》引入静态库的文件(bin--lib)

应用

测试boost

# include "boost/scoped_ptr.hpp"
# include "boost/shared_ptr.hpp"
int main()
{
	boost::scoped_ptr<int> sp(new int);
	boost::shared_ptr<int> sp1(new int);
	return 0;
}

什么是智能指针,智能指针的实现原理?RAII?几个智能指针的原理及其缺陷?定制删除器?share_ptr中存在的循环引用的问题,及如何解决这些问题?

 

一、IO流

1、流:

(1)scanf():是一个不定参数,进行数据的输入,返回成功接收输入的个数,接收失败则返回0,成功几个则返回几个

        scanf先把要输入的数据放到缓冲区中,若是要放到一个具体的地址中,需要加上&,必须知道其地址,编译器检测不出来,但是程序一运行会发生崩溃。不能直接接收一个对象,因为对象没有对应的格式,需要一个个拆开,对里面的成员变量一个一个进行输入。

int a=1;
scanf("%d", &a);
scanf("%f", &a);//给成浮点型的格式,用整型接收,可能会出现错误
scanf("%d", a);//可以通过编译,但是代码运行结束后,程序会崩溃,这和scanf的参数有关系

   printf():进行数据的输出,成功打印字符的个数,也需要给出格式控制。

2、C++的IO流:C++中将要输入输出的IO流封装成了一个类库

(1)cout不用管格式控制的东西,也可以进行连续输出。运算符进行了重载,不需要给出格式,而直接进行输入和输出。不能使用cin或者cout输入、输出自定义类型。遇到自定义类型可以进行重载,重载之后直接进行输入和输出。

(2)在C++的类库里面,哪一部分操作失败了,可以调用其对应的函数,查看打印的结果是否正确【里面维护了一些二二进制的信息,检测打印失败的比特位在里面有没有设置,如果设置了则打印失败,设置了由类自动维护。

a、cerr:标准错误输出,发生了错误,将错误输出到屏幕上

b、clog:把错误输出到对应的文件中去

cout不是直接将输出的结果显示到屏幕上,而是把数据先放到缓冲区中去,若果后面加上endl,则将数据输出到屏幕上去。遇到flush清空缓冲区,此时也会将数据输出到屏幕上去,其他位置的输出,不能直接输出到屏幕上。但是有些编译器没有按照这种标准实现,直接将输出输出到屏幕上去。【cin、cout、cerr、clog维护的四个全局变量】【输出时也可以控制进制,每一个状态用一个比特位表示,多个状态的组合即将这些比特位或起来】

(3)cout的输出也可以进行格式的控制

# include<iomanip>
int main()
{
	cout << hex << 10 << endl;//将10按照十六进制输出
	setw(5);
	cout << dec<<10 << endl;//将10的宽度设置位5位,设置回10进制
	system("pause");
	return 0;
}

  (4)填充:fill将多出来的位用具体的字符填充。

(5)、cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。不可能用刷新来清 除缓冲区,所以不能输错,也不能多输。

(6)输入的数据类型必须与要提取的数据类型一致,否则出错。出错只是 在流的状态字state中对应位置位(置1),程序继续
(7)空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII 码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读 入。
2、c++文件操作

二进制文件:打开之后是乱码【直接将内存中的格式转移到文本文件中】

 

文本文件:文本文件打开后可以看清里面的文件

posted on 2018-08-07 18:17  众里寻他2018  阅读(68)  评论(0)    收藏  举报

导航