homework-07
Stack
1 #include<iostream> 2 using namespace std; 3 char *get_hello(){ 4 char b[] = "hello c++ hehe"; 5 return b; 6 } 7 int main(void){ 8 cout << get_hello()<<endl; 9 }
输出乱码:
[forwil@localhost homework-07]$ ./a.out (�fK
另一种方式:
1 #include<iostream> 2 using namespace std; 3 char *get_hello(){ 4 char *b = "hello c++ hehe"; 5 return b; 6 } 7 int main(void){ 8 cout << get_hello()<<endl; 9 }
输出正确结果:
[forwil@localhost homework-07]$ ./a.out hello c++ hehe
发现其中*b中的b内存地址在:0x8048864
而b[]其中b存在:0xbfbd6821
这说明,*b中的 "hello c++ hehe"是存在代码段0x8048以上的常量,而下面b[]中是存在栈空间的。栈空间的内存在函数结束后被系统经过某种方法赋值成新值,所以出现了上述奇怪的现象。
Heap
1 #include<iostream> 2 using namespace std; 3 int *s1; 4 int *s2; 5 void get_213(){ 6 int *a = new int(213); 7 int b = 213; 8 s1 = a; 9 s2 = &b; 10 } 11 int main(void){ 12 get_213(); 13 cout << *s1 << endl; 14 cout << *s2 << endl; 15 return 0; 16 }
输出:
[forwil@localhost homework-07]$ ./a.out 213 1265407564
显然,堆空间的存在不依赖于函数的调用,而是取决于程序员的需要。
unique_ptr和shared_ptr
unique_ptr和shared_ptr都是c++11引入的smart pointer,两者的使用很容易理解:
unique_ptr:
两个unique_ptr不能指向一个对象,不能进行复制操作只能进行移动操作。unique_ptr在超出作用域,即以下情况时它指向的对象会被摧毁:
1、unique_ptr指向的对象被破坏
2、对象通过operator=()或reset()被指定到另一个指针)
第2种情况下,指针内存的生命周期就转移到了新的指针上面。
shared_ptr:
shared_ptr会记录有多少个shared_ptrs共同指向一个对象。这便是所谓的引用计数(reference counting)。一旦最后一个这样的指针被销毁,也就是一旦某个对象的引用计数变为0,这个对象会被自动删除。这在非环形数据结构中防止资源泄露很有帮助。
(shared_ptr最初实现于Boost库中,后来被C++标准委员会收录于TR1技术报告中,成为C++0x的一部分。)
(垃圾回收最早起源于Lisp语言。目前许多语言如Smalltalk、Java、C#都支持垃圾回收器。在C++11之前,就有Boehm GC在C/C++语言已经实现了一个保守的垃圾回收器。对于程序语言的发展,C++的这次的引入显然落后太久了,旁白:这对C++来说已经很了不起了!你知道C++有多努力吗?!)
分割一个url
请给我一个非得用c++来写这种东西的理由!!
c语言版:
1 #include<stdio.h> 2 #define MAXL 255 3 char s[MAXL]; 4 int main(void) 5 { 6 int i = 0,t = 0; 7 fgets(s,MAXL,stdin); 8 while(s[i]) 9 { 10 if (i>=2 && s[i-2] == ':' && s[i-1] == '/' && s[i]== '/') 11 { 12 s[i-2] = '\0'; 13 printf("%s ",&s[t]); 14 t = i + 1; 15 } 16 else if (s[i] == '.' || (s[i] =='/' && s[i-1]!=':' ) || s[i] == '\n') 17 { 18 s[i] = '\0'; 19 printf("%s ",&s[t]); 20 t = i + 1; 21 } 22 i += 1; 23 } 24 return 0; 25 }
测试:
[forwil@localhost homework-07]$ ./a.out http://msdn.microsoft.com/en-us/library/vstudio/hh279674.aspx http msdn microsoft com en-us library vstudio hh279674 aspx
Python版
print raw_input("input the url:").replace("://",",").replace(".",",").replace("/",",")
测试:
[forwil@localhost homework-07]$ python url.py input the url:http://msdn.microsoft.com/en-us/library/vstudio/hh279674.aspx http,msdn,microsoft,com,en-us,library,vstudio,hh279674,aspx
追求运行效率我会使用c,追求代码简便性我会使用Python。
考察重点:
1. 类的定义和使用,基本成员是否完整
为什么我要用oop这么复杂的东西?这个题目哪里涉及到了封装,多态,继承了?
2. 输入参数的检查及其他鲁棒性的考虑
url的分割规则很简单,只要实现规则就行,参数? 题目没有要求。
3. STL和C++11元素的使用
不想用c++写
4. 除http://之外, 是否有考虑ftp:// site:// 等情况
直接分割"://",所有情况都考虑到了
5. 是否考虑url中的中文
不用考虑,两种方法都自动支持。
6. 算法是否简洁高效
c语言的已经达到最高效,Python达到了最简洁。
7. 代码风格
功能很简单,谈不上风格。