1.局部变量生命周期

 #include "iostream.h"

 void add1(int i){i = i + ;}

 int main()
{
int n = ;
add1(n); cout << n << endl;//输出结果为1,n的值并没有被改变
return ;
}

就像上面说的,局部变量只存活于函数内部,所以add1函数并不能改变n的值。

2.对于堆和栈内存申请方式,之前并不清楚这是个什么概念,在查过后发现下面这样的内容:

堆和栈的区别:

1、申请和响应不同:

(1)申请方式:

stack由系统自动分配,系统收回;heap需要程序员自己申请,C中用函数malloc分配空间,用free释放,C++用new分配,用delete释放。

(2)申请后系统的响应:

栈:只要栈的剩余空间大于所申请的空间,体统将为程序提供内存,否则将报异常提示栈溢出。

堆:首先应该知道操作系统有一个记录内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请的空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码中的delete或free语句就能够正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会将多余的那部分重新放入空闲链表中。

2、申请的大小限制不同:

栈:在windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域,栈顶的地址和栈的最大容量是系统预先规定好的,能从栈获得的空间较小。

堆:堆是向高地址扩展的数据结构,是不连续的内存区域,这是由于系统是由链表在存储空闲内存地址,自然堆就是不连续的内存区域,且链表的遍历也是从低地址向高地址遍历的,堆得大小受限于计算机系统的有效虚拟内存空间,由此空间,堆获得的空间比较灵活,也比较大。

3、申请的效率不同:

栈:栈由系统自动分配,速度快,但是程序员无法控制。

堆:堆是有程序员自己分配,速度较慢,容易产生碎片,不过用起来方便。

4、堆和栈的存储内容不同:

栈:在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令的地址,然后是函数的各个参数,在大多数的C编译器中,参数是从右往左入栈的,当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令。

堆:一般是在堆得头部用一个字节存放堆得大小,具体内容由程序员安排

这样的话,堆和栈的申请方式代码就是:

  #include "iostream.h"

  int main()
{
int n = ;//栈
int *m = new int ();//堆
cout << n << ' ' << *m << endl;
return ;
}

3.unique_ptr和shared_ptr

这两个东西以前根本没有听说过,官网上是这样描述这两者的:

unique_ptr不会共享它的指针。 无法将它复制到另一个unique_ptr,(除非它是可修改 rvalue) 通过值传递给函数,或需要对其进行复制的任何标准模板库 (STL) 算法中使用。 A unique_ptr只能移动。 这意味着内存资源的所有权将转移到新的unique_ptr和原始unique_ptr不再拥有它。 我们建议您将一个对象限制为一个所有者,因为拥有多个程序逻辑增加复杂性。 因此,当您需要为普通的 C++ 对象的智能指针,使用unique_ptr

shared_ptr 类型是智能指针在为方案设计多个所有者可能必须管理对象生存期内存中的 C++ 标准库中。 在初始化可以将它复制的 shared_ptr 后,将它在函数参数的值,并将其分配给其他 shared_ptr 实例。 所有实例指向同一对象,并且,对“的共享访问控制块”该引用计数的增量和减量,每当新shared_ptr 添加,超出范围或重新设置。 当引用计数达到零时,控制块删除内存资源和自身。

说实话,看不太懂,只能简单的理解一下,unique_ptr指向的位置不能同时被另一个指针所指,在有新的指针指向同一位置的时候,之前的指针将会置空;而对于shared_ptr则没有这么强的要求,可以多个指针指向同一个位置,此外,shared_ptr内还有一个计数器,对指向被指向位置的指针数目进行统计,实时改变。其余的内容就不是很懂了。

4.url分割

其实不是很明白C++11风格是什么,或者说不知道我用的风格是什么,所以只写这一段代码。查了一下STL的意思,看了看,好像不太懂,也就没敢用。

 #include "iostream"
#include "string"
using namespace std; int main()
{
char in[];
char token[];
int i = ;
memset(in , ,);
memset(token , ,); while(true){
cout << "input:" ;
cin >> in ; for(i = ; i < ; i++)
token[i] = in[i];
if(strcmp(token , "http://") == ){//url合法性检测,以下类似
i = ;//双斜杠后起始位置
cout << "output:" ;
cout << "http,";
break;
}
else if(strcmp(token , "site://") == ){
i = ;
cout << "output:" ;
cout << "site,";
break;
}
else if(strcmp(token , "ftp://") == ){
i = ;
cout << "output:" ;
cout << "ftp,";
break;
}
else cout << "Input error!" << endl;//错误提示并重新输入
} while (true)
{
if(in[i] == '\0')break;//结束标志
if(in[i] == '/' ||in[i] == '.'){//分割标志
cout << "," ;
i++;
continue;
}
while(in[i] != '/' && in[i] != '.' && in[i] != '\0')cout << in[i++];//单词输出
continue;
}
cout << endl;
return ;
}

办法似乎很笨,但是很简单。

homework08的更多相关文章

  1. 【现代程序设计】homework-08

    1. 理解C++变量的作用域和生命周期 a) 用少于10行代码演示你对局部变量的生命周期的理解 #include <iostream>int main() { ; ;i<;i++); ...

  2. 现代程序设计 homework-08

    现代程序设计 homework-08 第八次作业. 理解C++变量的作用域和生命周期 作用域就是一个变量可以被引用的范围,如:全局作用域.文件作用域.局部作用域:而生命周期就是这个变量可以被引用的时间 ...

  3. homework-08

    这次作业是考察关于C++的一些使用,由于我的C++只掌握了基本功,所以我只有霸王硬上弓,勉强写写自己的浅见. 1. 理解C++变量的作用域和生命周期 对一个C++变量来说,有两个属性非常重要:作用域和 ...

  4. 【现代程序设计】【homework-08】

    1. 理解C++变量的作用域和生命周期 #include<stdio.h> char * test() { ]="; return s; } main() { puts(test ...

  5. 现代程序设计——homework-08

    写在前面 以下内容出自一个对C++只有一点点了解,几乎没有写过C++程序的人,理解上的一定会很不到位,请各位路过神牛多多指点. 博客内容为对 http://www.cnblogs.com/softwa ...

  6. homework-08 C++课程课后思考与练习

    经过上次晚交作业导致没分以后 我再也不敢晚交作业了 今天就把这次作业先写了 homework Part 1 1. 理解C++变量的作用域和生命周期 a) 用少于10行代码演示你对局部变量的生命周期的理 ...

  7. [课程相关]homework-08

    一.变量作用域和生命周期 #include <cstdlib> #include <iostream> using namespace std; void try_change ...

  8. 1028作业:Java语法基础

    //1.输入长与宽计算长方形面积与周长.(用精度类型计算) package com.lovo.J133; import java.util.Scanner; public class Homework ...

  9. java基础编程练习

    1.编写程序实现对给定的 4 个整数从大到小的顺序排列. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...

随机推荐

  1. openfire的smack和asmack

    smack你可以看成是一套封装好了的用于实现XMPP协议传输的API,它是一个非常简单并且功能强大的类库,给用户发送消息只需要三行代码.下载地址:http://www.igniterealtime.o ...

  2. C# App.config 详解

      读语句: String str = ConfigurationManager.AppSettings["DemoKey"]; 写语句: Configuration cfa = ...

  3. ASP.NET 数据绑定常用代码及其性能分析

    用DataBinder.eval 绑定不必关心数据来源(Dataread或dataset).不必关心数据的类型eval会把这个数据对象转换为一个字符串.在底层绑定做了很多工作,使用了反射性能.正因为使 ...

  4. 1208. Legendary Teams Contest(dfs)

    1208 简单dfs 对于每个数 两种情况 取还是不取 #include <iostream> #include<cstdio> #include<cstring> ...

  5. android上的缓存、缓存算法和缓存框架

      1.使用缓存的目的 缓存是存取数据的临时地,因为取原始数据代价太大了,加了缓存,可以取得快些.缓存可以认为是原始数据的子集,它是从原始数据里复制出来的,并且为了能被取回,被加上了标志. 在andr ...

  6. centos的版本和内核查看

    查看linu的内核信息 查看distrubution,centos属于哪个release

  7. Qt之QuaZIP(zip压缩/解压缩)

    简述 QuaZIP是使用Qt/C++对ZLIB进行简单封装的用于压缩及解压缩ZIP的开源库.适用于多种平台,利用它可以很方便的将单个或多个文件打包为zip文件,且打包后的zip文件可以通过其它工具打开 ...

  8. BZOJ2151: 种树

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2151 题解:此题=数据备份.喜闻乐见挂链表. 代码: #include<cstdio&g ...

  9. asp.net正则表达式过滤标签和数据提取

    无论什么语言,正则表达式的处理方法都是非常灵活.高效的,尤其是对某些字符串的抓取.过滤方面,更显其优势. 正则表达式的写法通常比较简单,几行短代码便能轻松完成看似很复杂的事情,更值得称赞的是,它的执行 ...

  10. django - request.raw_post_data 与 request.body

    request.raw_post_data 重命名成了 request.body - 在1.3版本之后. 这是当时 起票 的讨论内容:https://code.djangoproject.com/ti ...