zoukankan      html  css  js  c++  java
  • 作业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
    ", p, *p, t, *t);
        fun2();
        printf("p:%x->%d t:%x->%d
    ", 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, "
    "));
        
        system("pause");
        return 0;
    }

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

  • 相关阅读:
    spring boot-11.全局捕获异常
    spring boot-10.国际化
    spring boot-9.对springMVC的支持
    spring boot-8.静态资源映射
    spring boot-7.日志系统
    spring boot-6.profile 多环境支持
    spring boot-4.配置文件
    spring boot-3.原理探究
    【C/C++】产生随机数
    【C/C++】获取当前系统时间
  • 原文地址:https://www.cnblogs.com/mountainking/p/3428459.html
Copyright © 2011-2022 走看看