homework_08
一.C++变量的作用域和生命周期


上面的程序中第一个正整数a的作用域是整个程序,而第二个正整数a的作用域是大括号内,除了大括号它的生命周期就结束了。因此先输出的是2,而后输出的是1.
二.理解堆和栈,两种内存的申请和释放的方式
栈区,局部存在,系统分配,作用周期在两个花括号之间(或函数体or其他结构体),进入花括号,操作系统会在栈中开辟一些空间,esp指针减少,称为入栈,当退出花括号,系统会释放分配的栈之内存,esp指针增加,恢复到入花括号之前的状态,称之为出栈。
堆区,全局存在,程序员主动申请,主动释放,如果不释放,导致内存不足,于一个常驻进程内存泄漏,导致程序异常,无法继续申请内存,当程序结束后,此部分内存由操作系统收回。
#include <stdio.h>
int gv;
int main()
{
const char * cvchar="hello";
static int mvar = ;
int a,b;
{
int x = ;
char * p = (char *)malloc();
printf("%s");
free(p);
}
}
这里特别说明,p指针所占的四个字节的空间为栈区,而p指针所指向的分配空间内存(即15个字节的内存)为堆区。
三.理解unique_ptr和shared_ptr
unique_ptr之间不会分享它的指针,它不能被复制到另一个unique_ptr,不能按值传递给一个函数,也不能应用在任何需要复制操作的标准模板库(STL)的算法上。unique_ptr只能被移动。这意味着,存储器资源的所有权被转移给另一个unique_ptr,原始的unique_ptr不再拥有所有权。我们在使用中最好限制一个所有权拥有者只能拥有一个对象,因为多种所有制增加了程序逻辑的复杂性。当我们需要一个智能指针指向一个普通的C ++对象,可以使用unique_ptr,当我们构建unique_ptr时,可以使用make_unique辅助函数。
shared_ptr是一种应用在C+ +标准库专为场景中可能同时有多个所有者来管理内存中对象的寿命的智能指针。初始化一个shared_ptr后,你可以复制它,通过函数参数传值,将其分配给其他shared_ptr的实例。所有shared_ptr实例指向同一个对象,共享访问“控制块”。当有新的智能指针加入、退出或是复位,控制块计数器做出相应改变。当控制块引用计数达到零,则控制块中删除相应的内存资源还有它本身。
四.请尝试用“C++0x”,“C++11 & STL”两种不同的代码风格分割一个url,并上传代码到博客上。
"C++0x":
#include "stdafx.h"
#include <iostream>
#include <string.h>
#pragma warning(disable:4996)
using namespace std; class address
{
public:
void input()
{
cout<<"请输入url地址:"<<endl;
cin>>url;
}
void process()
{
const char *d = "/:.";
char *p;
p=strtok(url,d);
while(p)
{
printf("%s,",p);
p=strtok(NULL,d);
}
}
private:
char url[100];
}; int _tmain(int argc, _TCHAR* argv[])
{
address url;
url.input();
url.process();
system("pause");
return 0;
}
使用了strtok函数进行分割,考虑了中文字符的情况以及ftp,site的情况。截图如下:

C++ 11&STL:
#include "stdafx.h"
#include <iostream>
#include <string>
#include<vector>
using namespace std; class address
{
public:
void input()
{
cout<<"请输入url地址:"<<endl;
cin>>url;
}
void process(string split)
{
std::string::size_type pos;
url+=".";
int size=url.size();
for(int i=;i<size;i++)
{
pos=url.find_first_of(split,i);
if(pos<size)
{
string s=url.substr(i,pos-i);
result.push_back(s);
if(pos+==size)
break;
i=url.find_first_not_of(split,pos)-;
}
}
}
void output()
{
for(int i=;i<result.size();i++)
{
cout<<result[i]+",";
}
}
private:
vector<string> result;
string url;
};
int main()
{
address URL;
string s="/:.";
URL.input();
URL.process(s);
URL.output();
system("pause");
return ;
}
使用的是string类。
homework_08的更多相关文章
随机推荐
- .net MVC APi调用
常用的调用方法为Get/Post Get方法: 服务器 public string Get(int id) { return "value"; } 这个直接在网页就可以测试,用 h ...
- Wince 中如何实现注册表恢复原厂设置
理论: 使用HIVE注册表,系统在完成了第一阶段也就是加载完了boot.hv+binfs之后和加载系统HIVE注册表之前,filesys.exe都会调用OEMIoControl来查询是否需要清除保存在 ...
- BZOJ 3207 花神的嘲讽计划Ⅰ(函数式线段树)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3207 题意:给出一个数列,若干询问.每个询问查询[L,R]区间内是否存在某个长度为K的子 ...
- 【POJ】3523 The Morning after Halloween
1. 题目描述$m \times n$的迷宫(最大为$16 \times 16$)包含最多3个点,这些点可以同时向相邻方向移动或保持停止,使用小写字母表示起始位置,使用大写字母表示中止位置.求最少经过 ...
- 方法Equals和操作符==的区别
http://www.codeproject.com/Articles/584128/What-is-the-difference-between-equalsequals-and-Eq When w ...
- [HDOJ4635]Strongly connected(强连通分量,缩点)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给一张图,问最多往这张图上加多少条边,使这张图仍然无法成为一个强连通图. 起初是先分析样例 ...
- 1242. Werewolf(dfs)
1242 简单dfs 往孩子方向搜一遍 父母方向搜一遍 输入还搞什么字符串.. #include <iostream> #include<cstdio> #include< ...
- Linux“Bash”漏洞大爆发
9月25日,国外曝出一个“毁灭级”的Bash漏洞,黑客可利用此漏洞远程执行任意命令,完全控制目标系统! 该漏洞编号为CVE-2014-6271,主要存在于bash 1.14 - 4.3版本中,受影响的 ...
- HNOI2004宠物收养所(平衡树)
treap! var i,n,x,y,ans,a,b,root,tot,ft:longint; l,r,s,v,hr:..] of longint; procedure r_rotate(var x: ...
- EF DataBase First生成model的验证
如何避免在EF自动生成的model中的DataAnnotation被覆盖掉 相信很多人刚接触EF+MVC的时候,DataBase First模式生成model类中加验证信息的时候,会在重新生成mode ...