一.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. python 批量更换图片格式脚本

    问题:将某文件下的所有jpg的图片更换为png的图片 简单的实现: # -*- coding:utf-8 -*- from os.path import splitext import glob fr ...

  2. 01-语言入门-01-A+B Problem

    题目地址: http://acm.nyist.net/JudgeOnline/problem.php?pid=1    描述 此题为练手用题,请大家计算一下a+b的值   输入 输入两个数,a,b 输 ...

  3. Image.FrameDimensionsList 属性-----具体使用案例

    上一篇中说到了图片的具体产生以及属性,本篇主要是具体的使用,详情案例见下面的具体视图及代码 using System;using System.Collections.Generic;using Sy ...

  4. 客户视角:Oracle ETL工具ODI

    客户视角:Oracle ETL工具ODI 数据集成已成为企业在追求市场份额中的关键技术组件,与依靠手工编码的方式不同,越来越多的企业选择完整的数据集成解决方案来支持其IT战略,从大数据分析到云平台的集 ...

  5. disable-linux-firewall-under-centos-rhel-fedora

    http://www.cyberciti.biz/faq/disable-linux-firewall-under-centos-rhel-fedora/

  6. ha_innobase::open

    http://mysql.taobao.org/monthly/2015/08/07/ /******************************************************* ...

  7. 使用Python脚本强化LLDB调试器

    LLDB是Xcode自带的调试器,作为一个iOS应用开发程序员,平时我在开发应用时会使用LLDB来调试代码.在逆向应用时,也会用到LLDB来跟踪应用的执行过程. LLDB还内置了一个Python解析器 ...

  8. vim 支持 markdown 语法

    /************************************************************************* * vim 支持 markdown 语法 * 说明 ...

  9. BMP图像格式

    BMP(全称Bitmap)是Window操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广.它采用位映射存储格式,除了图像深度可选以外,不采用其他任 ...

  10. .NET之美——1.1 C#中的泛型

    1.1 C#中的泛型 .Net 1.1版本最受诟病的一个缺陷就是没有提供对泛型的支持.通过使用泛型,我们可以极大地提高代码的重用度,同时还可以获得强类型的支持,避免了隐式的装箱.拆箱,在一定程度上提升 ...