一.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的更多相关文章

随机推荐

  1. jboolean

    bool为C中变量类型,jboolean 为JNI中变量类型,boolean为Java中变量类型:jboolean在C语言的定义为:typedef unsigned char jboolean;uns ...

  2. 转:Cache相关

    声明:本文截取自http://blog.163.com/ac_victory/blog/static/1033187262010325113928577/ (1)“Cache”是什么 Cache(即高 ...

  3. Android仿iPhone晃动撤销输入功能(微信摇一摇功能)

    重力传感器微信摇一摇SensorMannager自定义alertdialogSensorEventListener 很多程序中我们可能会输入长文本内容,比如短信,写便笺等,如果想一次性撤销所有的键入内 ...

  4. JAVA调用易信接口向指定好友推送消息(一)背景需求

    众所周知,中国电信内部一直使用易信群进行交流 各种工作交流都在易信群里面沟通 包括投诉处理,障碍报修,拍照上传 最重要的就是每天甚至每个时点的指标完成情况的通报 所以只能用4个字来形容 String ...

  5. LA 3357 (递推 找规律) Pinary

    n位不含前导零不含连续1的数共有fib(n)个,fib(n)为斐波那契数列. 所以可以预处理一下fib的前缀和,查找一下第n个数是k位数,然后再递归计算它是第k位数里的多少位. 举个例子,比如说要找第 ...

  6. UVa 10129 (并查集 + 欧拉路径) Play on Words

    题意: 有n个由小写字母的单词,要求判断是否存在某种排列使得相邻的两个单词,前一个单词末字母与后一个单词首字母相同. 分析: 将单词的两个字母看做节点,则一个单词可以看做一条有向边.那么题中所求的排列 ...

  7. ListView 使用

    1. 不使用xml 文件 动态创建 Listview 并且绑定 ArrayList ListView listView = new ListView(this); listView.setAdapte ...

  8. Java [Leetcode 165]Compare Version Numbers

    题目描述: Compare two version numbers version1 and version2.If version1 > version2 return 1, if versi ...

  9. 搜集的一些RTMP项目,有Server端也有Client端

    查询一些RTMP的协议封装时找到了一些RTMP开源项目,在这里列举一下,以后有时间或是有兴趣可以参考一下: just very few of them. Red5 only contains a se ...

  10. 使用solrj操作solr索引库

    (solrj)初次使用solr的开发人员总是很郁闷,不知道如何去操作solr索引库,以为只能用<五分钟solr4.5教程(搭建.运行)>中讲到的用xml文件的形式提交数据到索引库,其实没有 ...