智能指针与命名空间
维基百科说明(中文的实在太不详细,英文的够全面):
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。