Skip to main content

Posts

Showing posts from August, 2017

C++中shared_ptr环形引用问题及weak_ptr的作用

     C++中双斜杠//只能注释一行,在这里我没有花时间排版,所以看起来//注释换了行。把代码复制到编辑器或IDE上看可能会好很多。     weak_ptr指向一个shared_ptr管理的对象,最重要的特点就是,weak_ptr不会改变shared_ptr的引用计数。weak_ptr更详细的介绍可以参考《C++ Primer》中文版第五版第420页。此篇文章将给出《C++ Primer》上没有给出的weak_ptr的用法。     在使用shared_ptr的时候,可能会出现环形引用的问题。一旦出现了环形引用(Circular Reference),就会导致两个shared_ptr的引用计数都没办法减到1,也就没办法销毁对象,程序结束的时候就没办法正常地释放内存。下面将演示一下这种情况。 #include<memory>    //shared_ptr定义在memory头文件中。 using namespace std; //我们先定义一个叫Node的类,包含两个数据成员。 struct Node{     shared_ptr<Node> previous;     shared_ptr<Node> next; }; int mian() {     //然后在main函数里定义两个指向Node类对象的shared_ptr并进行值初始化。     shared_ptr<Node> n1 = make_shared<Node>();  //此时n1计数器为1。     shared_ptr<Node> n2 = make_shared<Node>();  //此时n2计数器为1。     //不妨假设n1指向的对象名字为node_1,n2指向的叫node_2。     //接下来让node_1的next成员指向node_2,让node_2的previous成员指向node_1。     (*n1).next=n2;      //拷贝了n2,此时n2的计数器为2     (*n2).previous=n1;  //拷贝了n1,此时n1的计数器为2     //这时n1、n2就产生

C++文件流打开文件路径时的反斜杠用法

     系统:Windows 10     IDE:Code::Blocks 16.01      C++中双斜杠//只能注释一行,在这里我没有花时间排版,所以看起来//注释换了行。      预备知识:转义序列      在C++语言中有特殊含义的字符(单引号、双引号、问号、反斜线)是不能直接打印出来的,必须用到转义序列,转义序列以反斜线作为开始。      \n代表换行符,\?代表问号,\'代表单引号,\"代表双引号,\\代表反斜线。想查看更多转义序列请自己去Google。      在用《C++ Primer》学习C++的文件输入输出的部分的时候,会遇到一个疑问:到底怎么打开一个具体的文件?书上只给出了格式,而没给出具体实例,这就导致了自己真正操作的手会遇到问题。            fstream fstrm;     //创建一个未绑定的文件流。fstream是头文件fstream中定义的一个类型,fstrm是此类型的一个流对象。      fstream fstrm(s);     //创建一个绑定了文件名为s的文件流,s可以是:                       //[方法1:一个string类型],或者,[方法2:指向C风格字符串的指针]。      示范一: ofstream os;    //创建了未绑定的os。 string filename_1;   //定义一个存储文件路径string类型的对象。 cout<<"请输入文件路径:"<<endl; getline(cin,filename_1);    //读取输入的文件名或路径,存入filename_1。                             //用getline而不用cin的好处是,有些文件名可能会带有空格,                             //getline读入整行包括空格,而cin遇到空格停止。 cout<<filename_1<<endl; os.open(filename_1);    //这里对应了方法1,即一个string类型。

shadowsocks服务器开启net-speeder在高延迟不稳定链路上优化单线程下载速度

在网上各种文章比较多,我在搭建的时候就走了不少弯路,所以搭建成功之后就想自己重新整理一遍方法,放到自己的 Blog 里,以后也方便一些。参考了网上其他文章,教程末尾有References。 此篇教程用 Debian 7 操作,已成功。之前用过 CentOS 6 ,也成功了。其他系统不一定。 注1:开启了net-speeder的服务器上对外ping时看到的是4倍,实际网络上是2倍流量。另外两倍是内部dup出来的,不占用带宽。 另外,内部dup包并非是偷懒未判断。。。是为了更快触发快速重传的。 注2:net-speeder不依赖ttl的大小,ttl的大小跟流量无比例关系。不存在windows的ttl大,发包就多的情况。 安装步骤: 1:下载源码并解压 wget https://github.com/snooda/net-speeder/archive/master.zip unzip master.zip 若遇到 unzip command not found,可以执行以下命令来安装unzip: apt-get install zip unzip 2:准备编译环境 debian/ubuntu: #安装libnet-dev: apt-get install libnet1-dev #安装libpcap-dev: apt-get install libpcap0.8-dev centos: #下载epel:https://fedoraproject.org/wiki/EPEL/zh-cn 例:CentOS6 64位: wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm #(如果是centos5,则在epel/5/下) #安装epel: rpm -ivh epel-release-6-8.noarch.rpm #然后即可使用yum安装: yum install libnet libpcap libnet-devel libpcap-devel 编译: 可能要先进入到net-speeder的目录下: