拷贝

阻止编译器默认生成拷贝构造函数和拷贝赋值函数

匿名 (未验证) 提交于 2019-12-03 00:36:02
为了阻止编译器默认生成拷贝构造函数和拷贝赋值函数,我们需要手动去重写这两个函数,某些情况 下,为了避免调用拷贝构造函数和 拷贝赋值函数,我们需要将他们设置成private,防止被调用。 但是类的成员函数和friend函数还是可以调用private函数,如果这个private函数只申明不定义,则会产生一个连接错误; 针对上述两种情况,我们可以定一个base类, 在base类中将拷贝构造函数和拷贝赋值函数设置成private ,那么派生类中编译器将不会自动生成这两个函数,且由于base类中该函数是私有的,因此,派生类将阻止编译器执行相关的操作。 另一个例子,如果在base类中,我们把赋值构造函数定义为私有成员。派生类的赋值会怎么样呢? 这时,如果我们没有定义赋值构造函数,则C++会拒绝为其派生类生成一个拷贝赋值操作符这些赋值操作。 因为在赋值时,会让基类成员调用基类自己的赋值构造函数,但是这时是私有的,所以就会出问题。 [cpp] view plain copy "font-size:14px;" > class protected private const const class public 我们希望最后这两句话不能通过编译,那么怎样在C++中实现呢?一种想当然的做法,就是不去写拷贝构造函数和赋值运算符。但由上一个条款可以知道,这样做是行不通的,C+

SVN 代码迁移

匿名 (未验证) 提交于 2019-12-03 00:34:01
第一步:将准备要迁移的仓库导出 svnadmin dump 第二步:在目标服务器上创建新的仓库 第三步:导入刚才导出的dump文件 svnadmin load 关键词: 原始仓库 备份仓库 原始仓库存放路径 备份仓库存放路径 将备份仓库文件拷贝到目标服务器上,然后进行导入操作 具体操作步骤: 1.找到装有原始svn服务器,然后找到VisualSVN Server的安装目录下的bin文件夹,将其拷贝 C:\Program Files\VisualSVN Server\bin 2.打开cmd命令,输入cd 刚才拷贝的bin文件夹的路径,回车 cd C:\Program Files\VisualSVN Server\bin 3.输入svnadmin dump 原始仓库存放路径 >备份仓库将要存放的路径(以dump的格式进行保存地址) C:\Program Files\VisualSVN Server\bin>sanadmin dump C:\Repositories\jyjf >d:\svntest\test.dump d:\svntest是自己在D盘新建的文件夹 4.打开目标服务器,找到VisualSVN Server的安装目录下的bin文件夹,将其拷贝 打开cmd命令,输入cd 拷贝的bin文件夹的路径,回车 5.输入 Svnadmin load 将要导入版本库的地址

OpenStack(Q版)-FWAAS环境部署

匿名 (未验证) 提交于 2019-12-03 00:30:01
一、OpenStack官方配置文档: https://docs.openstack.org/neutron/latest/admin/fwaas-v1-scenario.html https://docs.openstack.org/neutron-fwaas-dashboard/latest/install/index.html OpenStack版本: Q 开发环境: Ubuntu16.04 二、安装步骤: 1. apt-get 安装 neutron-fwaas apt-get -y install python-neutron-fwaas 2. pip安装 neutron-fwaas-dashboard 如果没有安装pip需要先安装 apt-get -y install python-pip 然后 pip install neutron-fwaas-dashboard 3. 下载源码并将源码中的panal文件拷贝到openstack的安装路径: mkdir /home/fwaas && cd /home/fwaas git clone https://git.openstack.org/openstack/neutron-fwaas-dashboard cd ./neutron-fwaas-dashboard/neutron_fwaas_dashboard/enabled

从统一资源分配符讲解移动语义

匿名 (未验证) 提交于 2019-12-03 00:30:01
前导知识: 1. 右值引用和其他引用一样,都是某个对象的别名 2. 右值引用绑定到的都是即将被销毁的并且没有其他用户的对象 3. 析构函数是系统进行析构前执行的最后一个函数,用以收尾,比如系统在析构某个指针的时候只会将栈上的指针析构掉而不会去把指针指向的那块内存析构掉,所以析构函数就是把这个指针指向的堆上的内存delete掉使其变成指向nullptr的空壳,然后系统进行析构时就不会造成内存泄漏了.理解析构函数做的工作并不是真正的析构,和系统进行的析构并不是同一个析构,这很重要. 为什么统一资源分配 ( unifying assignment operator )能work ? 几架马车都要有,想要统一资源分配符能跑的前提就是正确实现移动构造函数和swap函数 首先从名字看,”统一”指的是将移动赋值运算符和拷贝赋值运算符都统一至同一段代码中,这样做的好处显而易见,代码量更少,可读性更好 但关键是它为什么能够跑起来. 用《C++ Primer》 13.4节中的StrVec的做讲解,我们给它添加一个unifying assignment operator //// 拷贝赋值运算符 //StrVec &StrVec::operator=(const StrVec &ori) //{ // std::cout<< "使用了拷贝赋值运算符" <<std::endl; // auto new

U盘病毒 hypertrm.exe 修复

匿名 (未验证) 提交于 2019-12-03 00:22:01
1.最近电脑中了这种病毒,没有直观的感觉,不会蓝屏,也不会有其他任何异样,恶心的是他在我每次插入U盘的时候会提示INF默认安装,我没有对病毒样本做分析,感觉他只是创建了系统钩子,导致我尽管杀掉了u盘里所有的病毒,再次插上一切还会重来 2.解决办法:只讲方法 不说原理 u盘的资源管理器里输入cmd 敲一段命令 attrib -r -s -h *.* /s /d 这可以吧所有被病毒隐藏的程序,变出来 然后删掉hypertrm.exe 理论上还有一个同名的dll文件(不确定,有的话删了)还有一个乱码数据包 删了 反正是个u盘,不用太在意 这还只是表面功夫 这个病毒会在C盘的系统文件下复制一份自我拷贝,意味着你必须找到这份拷贝 我的病毒自我拷贝在 C:\ProgramData\MyFiles 文件目录下,里面有一个hypertrm.exe 其他的都是一些乱码文件,我暂时不清楚这些文件的作用,感觉是系统启动时产生的 这里面的文件类型一般都是无后缀类型和一个.dll文件 hypertrm.dll 删除不了,属于系统的东西,可以不用动他 OK 有问题欢迎留言,我会尽力帮助 不同u盘可能自我拷贝的位置不同,你可以试试看怎么找 任务管理器? 杀毒大师?(我好像没能发现他) 还有弹窗时可以 查看文件的具体位置 我用的方法! 这个病毒应该不会产生多大影响,但为了隐私请果断删除 文章来源: U盘病毒

IO模型

匿名 (未验证) 提交于 2019-12-03 00:15:02
用户调用了recvfrom这个系统调用,线程在等待内核获取数据和拷贝数据的两个阶段,线程都是被阻塞的 socket . accept socekt . recv 都会进入阻塞态 1. 在等待文件 io 的过程中,另外开起一个线程,让其他的连接不用排队,缺点是开启多线程是非常消耗系统资源的,线程的切换也是需要消耗时间的 应用程序以轮询的方式不断询问io的读取状态,用户调用recvfrom之后进程不会阻塞,会得到一个错误,当内核向用户内存拷贝数据时会进入阻塞状态,缺点是会大量的进行用户态到内核态的切换非常消耗时间 socket . setblocking ()#默认是 True socket . setblocking ( False ) #False的话就成非阻塞了 select/epoll这个function不断轮询所有的socket,当数据准备好内核会通知select就会返回,用户在调用read操作将数据拷贝到用户内存中 socket . setblocking ( False ) select . select ( read_l ,[],[]) 当用户读取数据时,回立刻进行返回,当数据拷贝到用户内存时,主动给用户进程发送一个signal信号 1. 阻塞与非阻塞,阻塞式 IO 模型会阻塞进程的执行知道操作完成,而非阻塞 IO 会立刻返回 2. 同步与异步,同步 IO 会将进程阻塞

C++――右值引用

匿名 (未验证) 提交于 2019-12-03 00:11:01
1.绑定到一个将要销毁的右值的引用――移动 2.左值表达式――对象的身份;右值表达式――对象的值 int i = 42 ; int & r = i ; int && rr = i ; //×,左值不能绑定到右值引用 int & r2 = i * 42 ; //×,右值不能绑定到左值引用 const int & r3 = i * 42 ; //√,右值可以绑定const引用 int && rr2 = i * 42 ; //右值绑定到右值引用 int && rr1 = 42 ; //√ int && rr2 = rr1 ; //×int&& rr3=std::move(rr1);//√,使用std可以避免潜在的命名冲突 3.左值持久,右值短暂(一般是字面常量,或表达式创建的临时对象(如上))//变量寿命很长的,出}才会被销毁 4.右值引用的对象即将被销毁且该对象没有其他用户 5.移动构造函数和移动赋值运算符 5.1 移动构造函数不分配任何新内存,直接接管给定的内存,接管后将原对象置为null StrVec ( StrVec && s ) noexcept : elements ( s . elements ), first_free ( s . first_free ), cap ( s . cap ) //接管s的资源 { s . elements = s . first_free

深浅拷贝

匿名 (未验证) 提交于 2019-12-03 00:09:02
copy就是复制一份,也就是所谓的抄一份.深浅拷贝其实就是完全复制一份,和部分复制一份的意思. 1. 先看看赋值运算 l1 = [1,2,3,['jason', 'egon']] l2 = l1 l1[0] = 111 print(l1) print(l2) # [111, 2, 3, ['jason', 'egon']] # [111, 2, 3, ['jason', 'egon']] l1[3][0] = 'kevin' print(l1) # [111, 2, 3, ['kevin', 'egon']] print(l2) # [111, 2, 3, ['kevin', 'egon']]   对于赋值运算来说,l1和l2指向的是同一个地址,所以他们是完全一样的,再举个例子,比如张三李四合租在一起,那么对客厅来说,他们是公用的,张三可以用, 李四可以用,但有一天张三把客厅的电视换成投影了,那么李四想在客厅看电视,而电视没有了,而是投影,l1,l2指向的是同一张表,任何一个变量对列表进行修改,剩下那个变量在使用列表之后,这个列表就是发生改变之后的列表. 2. 深浅拷贝 浅拷贝: 在内存中只额外创建第一层数据 >>> n1 = { 'k1' : 'v1' , 'k2' : 'v2' , 'k3' :[ 'liuyao' , 'job' ]} >>> n2 = copy.copy