【现代程序设计】【homework-08】
1. 理解C++变量的作用域和生命周期
#include<stdio.h> char * test() { char s[10]="1"; return s; } main() { puts(test()); }
test在调用结束后
系统给test分配的资源全部被释放
主函数main 调用test()所得到的值,将不会是期望的值1
截图:
2. 理解堆和栈,两种内存的申请和释放的方式
1、栈 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆 一般由编程者分配释放, 若编程者不释放,程序结束时可能由OS回收 。它与数据结构中的堆是两回事,分配方式类似于链表。
int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc"; 栈 char *p2; 栈 char *p3 = "123456"; 123456\0在常量区,p3在栈上 p1 = (char *)malloc(10); p2 = (char *)malloc(20); 分配得来得10和20字节的区域就在堆区。 strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 } 申请方式 stack: 由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间 heap: 需要编程者自己申请,并指明大小 在c中malloc函数 如int *p1 = (int *)malloc(10); 在C++中用new运算符 如int *p2 = new int[20]; 但是p1、p2本身是在栈中的。
3. 理解unique_ptr和shared_ptr
a) http://msdn.microsoft.com/en-us/library/vstudio/hh279676.aspx
b) http://msdn.microsoft.com/en-us/library/vstudio/hh279669.aspx
unique_ptr: 该指针只能指向内存上的一个资源,该指针被删除时,绑定的资源也将被释放
shared_ptr:对于内存上的统一个资源可以有多个不同的指针指向它,当所有指向该资源的指针都被删除时,该资源被释放
4. 请尝试用“C++0x”,“C++11 & STL”两种不同的代码风格分割一个url,并上传代码到博客上。
For example:
Input: http://msdn.microsoft.com/en-us/library/vstudio/hh279674.aspx
Output: http, msdn, Microsoft, com, en-us, library, vstudio, hh279674, aspx
考察重点:
1. 类的定义和使用,基本成员是否完整
2. 输入参数的检查及其他鲁棒性的考虑
3. STL和C++11元素的使用
4. 除http://之外, 是否有考虑ftp:// site:// 等情况
5. 是否考虑url中的中文
6. 算法是否简洁高效
7. 代码风格
c++0x风格
1 //借助strtok实现split 2 #include <string.h> 3 #include <stdio.h> 4 5 int main() 6 { 7 char s[100]; 8 const char *d = "/.:"; 9 gets(s); 10 char *p; 11 p = strtok(s,d); 12 while(p) 13 { 14 printf("%s,",p); 15 p=strtok(NULL,d); 16 } 17 18 return 0; 19 }
运行结果
c++ stl 风格
str 需要分割的string pattern 分割字符串的字符的string std::vector<std::string> split(std::string str,std::string pattern) { std::string::size_type pos; std::vector<std::string> result; str+=pattern;//扩展字符串以方便操作 int size=str.size(); for(int i=0; i<size; i++) { pos=str.find(pattern,i); if(pos<size) { std::string s=str.substr(i,pos-i); result.push_back(s); i=pos+pattern.size()-1; } } return result; }