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. 代码风格

  功能很简单,谈不上风格。

posted @ 2013-11-17 17:09  Forwil  阅读(263)  评论(0编辑  收藏  举报