智能指针与命名空间

维基百科说明(中文的实在太不详细,英文的够全面):

         http://zh.wikipedia.org/wiki/%E6%99%BA%E8%83%BD%E6%8C%87%E9%92%88

       http://en.wikipedia.org/wiki/Smart_pointer

 智能指针:

智能指针的提出是为了减少指针错误使用的风险(如边界越界、野指针、内存泄露等),使用智能指针,能够自动进行垃圾的回收和处理。

保留效率的情况下,提升安全性。智能指针主要用于内存管理,也用于网络资源的管理等。如果某一语言已经有了完善的内存回收机制

(如java C#),则智能指针的存在是没有意义的。

 实现智能指针有一般有两种途径:(1)使用引用计数(2)将对象的使用权分配给一个单一的指针。

C++中的智能指针:

在C++中,是使用模板类来实现智能指针的,并使用符号重载。(如auto_ptr)

 

 unique_ptr:但是auto_ptr会在进行复制操作时,会直接将值复制给另一个指针,在对复制操作要求比较严格的环境下并不使用。

故引入unique_ptr来进行指针的权限复制操作,也就意味着,一旦一个unique_ptr类型的指针将权限交给了另一个指针,则当前

指针的所有权被收回,另一个指针获得内存的使用权限。

 

shared_ptr和weak_ptr:shared_ptr是用来定义一共享空间的,即,若产生了一组shared指针指向同一内存空间,则使用引用计

数,只有在所有的shared指针全部删除的情况下,才会释放该段内存空间。

weak_ptr是用来定义弱指针,解决循环引用的问题的。即弱指针会想内存申请访问,但该段空间不一定存在。

 

 引用计数(reference counting):

是一种计数,记录了引用、指针、句柄等资源的数目。也使用引用计数来释放未引用的对象。

 

命名空间:

为了保证大量代码编写时,不出现重复标识符的情况,我们需要定义命名空间,以保证在命名空间中,只有唯一一个标识符,但在不同的命名空间

可以有不同的标示符。

在操作系统中,最明显的例子就是文件夹的层级结构,类似于命名空间。命名空间还被称为上下文(context)。使用方法为:namespace::identifier

 

名字:名字是跟随命名空间出现的,可表示对象或者概念。C++编译器将命名空间和名字合在一起,称为命名矫正(name mangling)。

 

命名矫正器(name mangling):

这一过程在编译器生成目标代码后的连接阶段,链接器将多个obj对象连接起来,百科释义:http://en.wikipedia.org/wiki/Name_mangling

若C++编译器是首先将代码转换成C语言,再使用C语言编译器将代码转换为目标的代码,如果不行行命名矫正,则会出现错误,因为C语言并不

支持函数重载操作,需要编译器根据标识符进行编译命名矫正,而后才能使C编译器正确解析标识符。具体举例:

例如有函数int f(void){return 0;} int f(int){return 0;}。编译器在进行解析时,是使用__f_v和__f_i来定义不同的函数名的,则可将两个函

数区分开来。命名矫正也针对类和命名空间,例如:

namespace wikipedia 
{
   class article 
   {
   public:
      std::string format (void); 
         /* = _ZN9wikipedia7article6formatEv */
 
      bool print_to (std::ostream&); 
         /* = _ZN9wikipedia7article8print_toERSo */
 
      class wikilink 
      {
      public:
         wikilink (std::string const& name);
            /* = _ZN9wikipedia7article8wikilinkC1ERKSs */
      };
   };
}
其中_Z表示预留标识符,与用户使用的标识符区分,N表示命名空间或者类名,数字表示字符串个数,注意第二个函数print_to其最后的
后缀为RSo是因为,R表示形参使用了引用,So表示std::ostream。

 

posted @ 2012-04-27 09:47  晒米的猫  阅读(417)  评论(0编辑  收藏  举报