作业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的吧!

posted on 2013-11-17 22:24  mountainking  阅读(166)  评论(0编辑  收藏  举报