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的更多相关文章
随机推荐
- Error running app: Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.解决办法
刚刚更新AS到2.0版本,然后导入Api Demos的时候出现了这个错误. 解决办法:在AS的菜单栏,Tools->Android ->Enable ADB integration 勾选就 ...
- [POJ1236]Network of Schools(并查集+floyd,伪强连通分量)
题目链接:http://poj.org/problem?id=1236 这题本来是个强连通分量板子题的,然而弱很久不写tarjan所以生疏了一下,又看这数据范围觉得缩点这个事情可以用点到点之间的距离来 ...
- Android手机拍照
参考的这个视频教程:http://v.youku.com/v_show/id_XNjI5MzkzMjQ4.html和官方API档file:///D:/Android/androidstudio/sdk ...
- Redis安装教程
1. Linux下Redis安装教程 (1)安装 #tar xf redis-2.6.14.tar.gz #cd redis-2.6.14 #make #make install (2)配置 修改re ...
- Android下 ionic view 无法登录
ionic view一个超棒工具,它是测试 ionic 框架搭建项目的app软件. 在它的官网有iphone 和 android 版本的下载地址.但是,这里只有在 google play 里面才有,而 ...
- 聚焦 SQL 数据库活动异地复制
Tobias Ternstrom US-DS-PM 首席部门项目经理 本文作为一系列业务连续性和灾难恢复文章的开篇,概述了业务连续性的各种场景,然后重点介绍 SQL 数据库高级服务级别提供的活动异地 ...
- ubuntu - chrome 标题栏, 书签乱码 解决
只要修改/etc/fonts/conf.d/49-sansserif.conf这个文件就行了—— 打开/etc/fonts/conf.d/49-sansserif.conf这个文件: sudo ged ...
- php mysql事务
这里记录一下php操作mysql事务的一些知识 要知道,MySQL默认的行为是在每条SQL语句执行后执行一个COMMIT语句,从而有效的将每条语句独立为一个事务.但是,在使用事务时,是需要执行多条sq ...
- wifi详解(三)
1 WLAN驱动结构介绍 1.1 SDIO驱动 在drivers/mmc下面是mmc卡,SD卡和SDIO卡驱动部分,其中包括host驱动,card驱动和core部分,由于网络接 ...
- JUC之Atomic系列12大类实例讲解和原理分解
在java6以后我们不但接触到了Lock相关的锁,也接触到了很多更加乐观的原子修改操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,以及并发中的AB ...