auto_ptr 鸡肋
auto_ptr
所引起的潜在危险是无法估量的(甚至比野指针还野)
请看示范
//e.g VC++6.0 + win2000
auto_ptr<char> g_pointer;//全局智能指针
{
char*p = new char[1024];
auto_ptr<char> pointer(p);//局部智能指针
g_pointer = pointer;//赋值,拥有权易手
//... using g_pointer
pointer = g_pointer;//拥有权再次易手
}//g_pointer指向的内存已释放
memcpy(g_pointer.get(),"hello auto_ptr",14);//实际上,所使用的内存已经是非法内存啦,
//但是程序不会出错;
//老天保佑这段内存不要分配给别的指针
//否则出现稀奇古怪的错误一点也不稀奇
//
总结:
这段示范性的代码展示的是一种什么呢?
即一旦你的程序范类似的错误(另外一种可以想见的错误是,
将外部智能指针传入一个函数参数中的智能指针中,一旦子函数返回,内部的临时指针释放内存),
你调试都调不出来(因为释放的内存还可以继续使用),这种错误真是太难找啦:
试想一下,你的程序在调试阶段没有出错(那是因为这段内存在调试期间没有再次分配给其他的),
却在用户那儿频繁出错(程序运行久了,这段内存总有可能被再次分配的),你怎么办?
拿回来检查?它又不出错了!!!
我想在这儿说的是:有时候内存泄漏并不是最可怕的,野指针才是最可怕的(它有时候使得程序出错
变成毫无规律可言),只有在某些时候(需要频繁分配再分配内存的地方,比如服务器编程,需要动态
连接n个客户,且客户的生存期比较短,又不是只针对固定客户的等等),内存泄漏才是致命的,但这种
内存泄漏是比较好发现的(但有可能不好查错),所以,劝君放弃auto_ptr吧