作业8
1.理解C++变量的作用域和生命周期
int* fun() { int i = 1; return &i; } //warning: address of local variable 'i' returned
2.理解堆和栈,两种内存的申请和释放的方式
#include <cstdio> #include <cstdlib> int *fun(int **t) { int num = 5; *t = new int[5]; **t = 1; return # } int fun2() { int num = 6; return num; } int main(int argc, char* argv[]) { int *p = NULL; int *t = NULL; p = fun(&t); printf("p:%x->%d t:%x->%d\n", p, *p, t, *t); fun2(); printf("p:%x->%d t:%x->%d\n", p, *p, t, *t); delete []t;system("pause"); return 0; } //p指向的是栈,而t指向的是堆,所以函数返回后*p变而*t不变,事实上不调用fun2() *p也会变。
3.理解unique_ptr和shared_ptr
智能指针基本上解决了在使用c++开发过程中不可避免的使用指针而遇到的许多问题,常见的毫无疑问是内存泄漏和内存的提前释放,还有一些关于指针内存申请而产生的异常问题。
下面说说使用两者的使用:
unique_ptr:unique_ptr指针本身的生命周期:从unique_ptr指针创建时开始,直到离开作用域。离开作用域时,若其指向对象,则将其所指对象销毁(默认使用delete操作符,用户可指定其他操作)。在智能指针生命周期内,可以改变智能指针所指对象,如创建智能指针时通过构造函数指定、通过reset方法重新指定、通过release方法释放所有权、通过移动语义转移所有权。
shared_ptr:share_ptr是一个类,它产生的是一个类对象,而不是一个原生的指针对象;要想生成一个存储void*型的指针,可以使用share_ptr(void*)构造函数来构造,它相当于一个泛型的指针容器,拥有容纳任意类型的能力,但是将包含void*指针的shared_ptr对象使用转型函数转型为某种类型的指针会使代码不够安全,一般不要使用。
4.请尝试用“C++0x”,“C++11 & STL”两种不同的代码风格分割一个url
#include <regex> #include <iostream> using namespace std; int main(int argc, char* argv[]) { regex check("[a-zA-z]+://[^\S]*"); regex split("://|[.&?/]"); vector<std::string> vec; string s; while(regex_match(s, check) != true) {//检查url cout << "请输入一段格式正确的URL: " << endl; cin >> s; } cout << "要分割的URL为: " << s << endl; //分割url sregex_token_iterator p(s.begin(), s.end(), split, -1); sregex_token_iterator end; while(p != end) { cout << *p++ << endl; } copy(vec.begin(), vec.end(), ostream_iterator<string>(cout, "\n")); system("pause"); return 0; }C++实在不会,这两种代码风格不知道有什么区别。。所以就让我来段C的吧!