一.C++变量的作用域和生命周期
上面的程序中第一个正整数a的作用域是整个程序,而第二个正整数a的作用域是大括号内,除了大括号它的生命周期就结束了。因此先输出的是2,而后输出的是1.
二.理解堆和栈,两种内存的申请和释放的方式
栈区,局部存在,系统分配,作用周期在两个花括号之间(或函数体or其他结构体),进入花括号,操作系统会在栈中开辟一些空间,esp指针减少,称为入栈,当退出花括号,系统会释放分配的栈之内存,esp指针增加,恢复到入花括号之前的状态,称之为出栈。
堆区,全局存在,程序员主动申请,主动释放,如果不释放,导致内存不足,于一个常驻进程内存泄漏,导致程序异常,无法继续申请内存,当程序结束后,此部分内存由操作系统收回。
#include <stdio.h> int gv; int main() { const char * cvchar="hello"; static int mvar = 15; int a,b; { int x = 2; char * p = (char *)malloc(15); 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=0;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+1==size) break; i=url.find_first_not_of(split,pos)-1; } } } void output() { for(int i=0;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 0; }
使用的是string类。