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

  • 相关阅读:
    IE浏览器cookie存放在本地什么目录
    C# clickonce 部署自定义文件
    [C#.Net]C#连接Oracle数据库的方法
    Eclipse 插件一览
    登录名 '***' 拥有一个或多个数据库。在删除该登录名之前,请更改相应数据库的所有者。 (Microsoft SQL Server,错误: 15174)
    SqlServer_表结构查询_查询当前用户所有表名
    sqlserver怎么删除有外键关联的数据?
    springboot logback控制台中文输出乱码
    控制台运行JAVA的jar文件时乱码 / Gradle编译设置编码格式
    Python 算法之一
  • 原文地址:https://www.cnblogs.com/mountainking/p/3428459.html
Copyright © 2011-2022 走看看