作业8

1.理解C++变量的作用域和生命周期

int* fun()

{

    int i = 1;

    return &i;

}

//warning: address of local variable 'i' returned

 

2.理解堆和栈,两种内存的申请和释放的方式

#include <cstdio>

#include <cstdlib>



int *fun(int **t)

{

    int num = 5;

    *t = new int[5];

    **t = 1;

    return &num;

}



int fun2()

{

    int num = 6;

    return num;

}



int main(int argc, char* argv[])

{

    int *p = NULL;

    int *t = NULL;

    p = fun(&t);

    printf("p:%x->%d t:%x->%d\n", p, *p, t, *t);

    fun2();

    printf("p:%x->%d t:%x->%d\n", p, *p, t, *t);

    delete []t;
    system("pause");

    return 0;

}

//p指向的是栈,而t指向的是堆,所以函数返回后*p变而*t不变,事实上不调用fun2() *p也会变。

 

3.理解unique_ptr和shared_ptr

智能指针基本上解决了在使用c++开发过程中不可避免的使用指针而遇到的许多问题,常见的毫无疑问是内存泄漏和内存的提前释放,还有一些关于指针内存申请而产生的异常问题。

下面说说使用两者的使用:

unique_ptr:unique_ptr指针本身的生命周期:从unique_ptr指针创建时开始,直到离开作用域。离开作用域时,若其指向对象,则将其所指对象销毁(默认使用delete操作符,用户可指定其他操作)。在智能指针生命周期内,可以改变智能指针所指对象,如创建智能指针时通过构造函数指定、通过reset方法重新指定、通过release方法释放所有权、通过移动语义转移所有权。

shared_ptr:share_ptr是一个类,它产生的是一个类对象,而不是一个原生的指针对象;要想生成一个存储void*型的指针,可以使用share_ptr(void*)构造函数来构造,它相当于一个泛型的指针容器,拥有容纳任意类型的能力,但是将包含void*指针的shared_ptr对象使用转型函数转型为某种类型的指针会使代码不够安全,一般不要使用。

4.请尝试用“C++0x”,“C++11 & STL”两种不同的代码风格分割一个url

#include <regex>

#include <iostream>



using namespace std;



int main(int argc, char* argv[])

{

    

    regex check("[a-zA-z]+://[^\S]*");

    regex split("://|[.&?/]");

    vector<std::string> vec;

    string s;

    

    while(regex_match(s, check) != true)

    {//检查url

        cout << "请输入一段格式正确的URL: " << endl;

        cin >> s;

    }

    cout << "要分割的URL为: " << s << endl;

    

    //分割url

    sregex_token_iterator p(s.begin(), s.end(), split, -1);

    sregex_token_iterator end;

    while(p != end)

    {

        cout << *p++ << endl;

    }

    copy(vec.begin(), vec.end(), ostream_iterator<string>(cout, "\n"));

    

    system("pause");

    return 0;

}

C++实在不会,这两种代码风格不知道有什么区别。。所以就让我来段C的吧!

你可能感兴趣的:(作业)