【现代程序设计】【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;
}

 

 

 

 

posted @ 2013-11-17 21:55  早餐  阅读(146)  评论(0编辑  收藏  举报