auto_ptr 鸡肋

zhougaomin_007 2003-06-24 05:30:29
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吧
...全文
164 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdtea 2003-09-19
  • 打赏
  • 举报
回复
我在作第一个项目时(水平低)用这个东西,差点累死我。
现在我改用boost库,方便多了,很灵活,不容易出错!
Wolf0403 2003-09-18
  • 打赏
  • 举报
回复
不妨看看《C++ 经典对话》,中间有两篇关于 auto_ptr 的。
http://taowen.cn.st
soon 2003-09-18
  • 打赏
  • 举报
回复
好贴,这样的贴才让人长见识
wingfiring 2003-09-17
  • 打赏
  • 举报
回复
1。auto_ptr不能处理数组。
2。auto_ptr应该只作用于单一的局部,或者一个类。
3。auto_ptr一般用来防止构造对象时候发生异常,常常和资源分配有关,可以写出异常安全的代码。
4。auto_ptr也可以用来避免写析构函数。
5。对于3,4,如何处理类的copy ctor, assign等等是要特别考虑的。

auto_ptr只是用来解决某一类特定问题,不是万能丹。

楼主还犯了个技术错误,失去拥有权的auto_ptr不是野指针,而是空指针。
猛禽 2003-09-17
  • 打赏
  • 举报
回复
自已用法错误怪auto_ptr不好,这真是叫那什么来着

楼下接
ejiue 2003-09-08
  • 打赏
  • 举报
回复
没有银弹 。
mcg 2003-09-05
  • 打赏
  • 举报
回复
大家还NEW 吧,省得大吵大闹的,最后别忘记DELETE就行
xkak2 2003-08-26
  • 打赏
  • 举报
回复
全局居然要用智能指针!
你根本就没有搞明白智能指针是干什么的。
1.auto_ptr不能用于数组,因为它调用的是delete,不是delete[]。
2.auto_ptr上只用于局部,尽可能不要用它共享内存。它的出现是为了防止异常情况下的内存泄露。
3.全局的指针一般来说是用于共享一块内存,你应该在你的程序初始化时初试这快内存,程序运行结束时释放内存,以防止共享失败。使用auto_ptr完全莫名其妙。
dengyunze 2003-07-13
  • 打赏
  • 举报
回复
而且auto_ptr不能处理数组,老兄的代码是不是根本就不对???
vlmf 2003-07-10
  • 打赏
  • 举报
回复
auto_ptr<char> g_pointer;//全局智能指针??????
有人这样用auto_ptr , 第一次看到!!! 全局的auto_ptr有什么意义? 真不明白
hookuy 2003-07-07
  • 打赏
  • 举报
回复
引用:

回复人: ThinkX(思·秋天的树·求职中) ( ) 信誉:99 2003-6-26 2:24:35 得分:0
在发表此言论前,请阅读一些相关资料并且观看auto_ptr的源代码。
james_razor 2003-07-04
  • 打赏
  • 举报
回复
还有,麻烦各位老大,用空看看我的另一个帖子:
“关于指针的拥有权移交问题”:
http://expert.csdn.net/Expert/topic/1973/1973522.xml?temp=.5886194
james_razor 2003-07-04
  • 打赏
  • 举报
回复
这不就结了,顶楼的看来对auto_ptr还不太了解,auto_ptr不是万能的,没有auto_ptr也不是万万不能的。不喜欢auto_ptr处理问题的方式和思路,不用就是了。
TopCat 2003-07-01
  • 打赏
  • 举报
回复
to james_razor(蹬三轮的):

auto_ptr不能用于数组
xiaoyunet 2003-06-30
  • 打赏
  • 举报
回复
vc6.0的auto_ptr实现是由debug的,你的程序在vc2003.net上,执行到最后一句,就崩溃了。
james_razor 2003-06-30
  • 打赏
  • 举报
回复
各位老大:
?? char*p = new char[1024];
!! auto_ptr<char> pointer(p);
auto_ptr能用在数组上吗?
amstrongest 2003-06-30
  • 打赏
  • 举报
回复
理解错误,不过据说auto-ptr是ISO和ANSI的中间产物??
noproblem_jyb 2003-06-30
  • 打赏
  • 举报
回复
只有最后一句还没有说,“对全世界都下assert”。
程序中连最基本的assert都没有,你在写device driver吗?
产品老唐 2003-06-30
  • 打赏
  • 举报
回复
auto_ptr1( auto_ptr2 ); // auto_ptr2的所有权释放

你的用法根本是错误的!!!
wangwencong 2003-06-29
  • 打赏
  • 举报
回复
钉钉子要用锤子
剪纸当然要用剪子
加载更多回复(12)

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧