homework08
1.局部变量生命周期
1 #include "iostream.h" 2 3 void add1(int i){i = i + 1;} 4 5 int main() 6 { 7 int n = 1; 8 add1(n); cout << n << endl;//输出结果为1,n的值并没有被改变 9 return 0; 10 }
就像上面说的,局部变量只存活于函数内部,所以add1函数并不能改变n的值。
2.对于堆和栈内存申请方式,之前并不清楚这是个什么概念,在查过后发现下面这样的内容:
堆和栈的区别:
1、申请和响应不同:
(1)申请方式:
stack由系统自动分配,系统收回;heap需要程序员自己申请,C中用函数malloc分配空间,用free释放,C++用new分配,用delete释放。
(2)申请后系统的响应:
栈:只要栈的剩余空间大于所申请的空间,体统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请的空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码中的delete或free语句就能够正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会将多余的那部分重新放入空闲链表中。
2、申请的大小限制不同:
栈:在windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域,栈顶的地址和栈的最大容量是系统预先规定好的,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域,这是由于系统是由链表在存储空闲内存地址,自然堆就是不连续的内存区域,且链表的遍历也是从低地址向高地址遍历的,堆得大小受限于计算机系统的有效虚拟内存空间,由此空间,堆获得的空间比较灵活,也比较大。
3、申请的效率不同:
栈:栈由系统自动分配,速度快,但是程序员无法控制。
堆:堆是有程序员自己分配,速度较慢,容易产生碎片,不过用起来方便。
4、堆和栈的存储内容不同:
栈:在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令的地址,然后是函数的各个参数,在大多数的C编译器中,参数是从右往左入栈的,当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令。
堆:一般是在堆得头部用一个字节存放堆得大小,具体内容由程序员安排
这样的话,堆和栈的申请方式代码就是:
1 #include "iostream.h" 2 3 4 int main() 5 { 6 int n = 1;//栈 7 int *m = new int (2);//堆 8 cout << n << ' ' << *m << endl; 9 return 0; 10 }
3.unique_ptr和shared_ptr
这两个东西以前根本没有听说过,官网上是这样描述这两者的:
A unique_ptr不会共享它的指针。 无法将它复制到另一个unique_ptr,(除非它是可修改 rvalue) 通过值传递给函数,或需要对其进行复制的任何标准模板库 (STL) 算法中使用。 A unique_ptr只能移动。 这意味着内存资源的所有权将转移到新的unique_ptr和原始unique_ptr不再拥有它。 我们建议您将一个对象限制为一个所有者,因为拥有多个程序逻辑增加复杂性。 因此,当您需要为普通的 C++ 对象的智能指针,使用unique_ptr。
shared_ptr 类型是智能指针在为方案设计多个所有者可能必须管理对象生存期内存中的 C++ 标准库中。 在初始化可以将它复制的 shared_ptr 后,将它在函数参数的值,并将其分配给其他 shared_ptr 实例。 所有实例指向同一对象,并且,对“的共享访问控制块”该引用计数的增量和减量,每当新shared_ptr 添加,超出范围或重新设置。 当引用计数达到零时,控制块删除内存资源和自身。
说实话,看不太懂,只能简单的理解一下,unique_ptr指向的位置不能同时被另一个指针所指,在有新的指针指向同一位置的时候,之前的指针将会置空;而对于shared_ptr则没有这么强的要求,可以多个指针指向同一个位置,此外,shared_ptr内还有一个计数器,对指向被指向位置的指针数目进行统计,实时改变。其余的内容就不是很懂了。
4.url分割
其实不是很明白C++11风格是什么,或者说不知道我用的风格是什么,所以只写这一段代码。查了一下STL的意思,看了看,好像不太懂,也就没敢用。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include "iostream" 2 #include "string" 3 using namespace std; 4 5 int main() 6 { 7 char in[100]; 8 char token[100]; 9 int i = 0; 10 memset(in , 0 ,100); 11 memset(token , 0 ,100); 12 13 while(true){ 14 cout << "input:" ; 15 cin >> in ; 16 17 for(i = 0; i < 7 ; i++) 18 token[i] = in[i]; 19 if(strcmp(token , "http://") == 0){//url合法性检测,以下类似 20 i = 7;//双斜杠后起始位置 21 cout << "output:" ; 22 cout << "http,"; 23 break; 24 } 25 else if(strcmp(token , "site://") == 0){ 26 i = 7; 27 cout << "output:" ; 28 cout << "site,"; 29 break; 30 } 31 else if(strcmp(token , "ftp://") == 0){ 32 i = 6; 33 cout << "output:" ; 34 cout << "ftp,"; 35 break; 36 } 37 else cout << "Input error!" << endl;//错误提示并重新输入 38 } 39 40 while (true) 41 { 42 if(in[i] == '\0')break;//结束标志 43 if(in[i] == '/' ||in[i] == '.'){//分割标志 44 cout << "," ; 45 i++; 46 continue; 47 } 48 while(in[i] != '/' && in[i] != '.' && in[i] != '\0')cout << in[i++];//单词输出 49 continue; 50 } 51 cout << endl; 52 return 0; 53 }
办法似乎很笨,但是很简单。