免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9393 | 回复: 17
打印 上一主题 下一主题

[C++] std::auto_ptr 是要被废了么 [复制链接]

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-04-04 14:30 |只看该作者 |倒序浏览
因为容易出错么?

“防止两个auto_ptr对象拥有同一个对象(一块内存)
由于auto_ptr的全部权独有。所以以下的代码会造成混乱。
int* p = new int(0);
auto_ptr<int> ap1(p);
auto_ptr<int> ap2(p);
由于ap1与ap2都觉得指针p是归它管的。在析构时都试图删除p, 两次删除同一个对象的行为在C++标准中是没有定义的。所以我们必须防止这样使用auto_ptr。

警惕智能指针作为參数!
1) 按值传递时,函数调用过程中在函数的作用域中会产生一个局部对象来接收传入的auto_ptr(拷贝构造),这样,传入的实參auto_ptr就失去了其对原对象的全部权,而该对象会在函数退出时被局部auto_ptr删除。”

template <class X> class auto_ptr;
Automatic Pointer [deprecated]
Note: This class template is deprecated as of C++11. unique_ptr is a new facility with a similar functionality, but with improved security (no fake copy assignments), added features (deleters) and support for arrays. See unique_ptr for additional information.

This class template provides a limited garbage collection facility for pointers, by allowing pointers to have the elements they point to automatically destroyed when the auto_ptr object is itself destroyed.

auto_ptr objects have the peculiarity of taking ownership of the pointers assigned to them: An auto_ptr object that has ownership over one element is in charge of destroying the element it points to and to deallocate the memory allocated to it when itself is destroyed. The destructor does this by calling operator delete automatically.

Therefore, no two auto_ptr objects should own the same element, since both would try to destruct them at some point. When an assignment operation takes place between two auto_ptr objects, ownership is transferred, which means that the object losing ownership is set to no longer point to the element (it is set to the null pointer).

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
2 [报告]
发表于 2016-04-04 18:23 |只看该作者
恩,已经没用了,用unique_ptr就好了

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
3 [报告]
发表于 2016-04-04 20:51 |只看该作者
这玩意儿5年前就已经被废了。

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
4 [报告]
发表于 2016-04-04 22:30 |只看该作者
本帖最后由 zhujiang73 于 2016-04-04 22:40 编辑
windoze 发表于 2016-04-04 20:51
这玩意儿5年前就已经被废了。



       但是历史遗留下来的代码不会自动修改完。 今天编译器提示:“/usr/include/glibmm-2.4/glibmm/objectbase.h|215|warning: ‘template<class> class std::auto_ptr’ is deprecated [-Wdeprecated-declarations]|”

       程序运行时正常工作,但是退出时遇到“free(): invalid pointer: 0x0000000000a99ab0 *** Aborted” 不知道是不是跟这个 std::auto_ptr 有关?
  1. #0 0x7ffff4306267        __GI_raise(sig=sig@entry=6) (../sysdeps/unix/sysv/linux/raise.c:55)
  2. #1 0x7ffff4307eca        __GI_abort() (abort.c:89)
  3. #2 0x7ffff4349bf3        __libc_message(do_abort=do_abort@entry=1, fmt=fmt@entry=0x7ffff4462168 "*** Error in `%s': %s: 0x%s ***\n") (../sysdeps/posix/libc_fatal.c:175)
  4. #3 ??        0x00007ffff4351c09 in malloc_printerr (ptr=<optimized out>, str=0x7ffff445e2ba "free(): invalid pointer", action=1) (malloc.c:4965)
  5. #4 ??        _int_free (av=<optimized out>, p=<optimized out>, have_lock=0) (malloc.c:3834)
  6. #5 0x7ffff435583c        __GI___libc_free(mem=<optimized out>) (malloc.c:2950)
  7. #6 0x7ffff399d77f        google::protobuf::internal::DestroyDefaultRepeatedFields() () (/usr/lib/x86_64-linux-gnu/libprotobuf.so.9:??)
  8. #7 0x7ffff399ca0b        google::protobuf::ShutdownProtobufLibrary() () (/usr/lib/x86_64-linux-gnu/libprotobuf.so.9:??)
  9. #8 0x7fffe77f32a9        ??() (/usr/lib/x86_64-linux-gnu/libmirprotobuf.so.3:??)
  10. #9 0x7ffff7de9c07        _dl_fini() (dl-fini.c:252)
  11. #10 0x7ffff430ad32        __run_exit_handlers(status=0, listp=0x7ffff4695698 <__exit_funcs>, run_list_atexit=run_list_atexit@entry=true) (exit.c:82)
  12. #11 0x7ffff430ad85        __GI_exit(status=<optimized out>) (exit.c:104)
  13. #12 ??        0x00007ffff42f1a47 in __libc_start_main (main=0x41db96 <main(int, char**)>, argc=1, argv=0x7fffffffe5e8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe5d8) (libc-start.c:323)
  14. #13 0x41dac9        _start () (??:??)
复制代码

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
5 [报告]
发表于 2016-04-05 09:51 |只看该作者
回复 4# zhujiang73

glibmm 2.4……这哪儿是遗留代码,这分明就是出土文物……8年了……一个抗战都打完了……

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
6 [报告]
发表于 2016-04-05 17:14 |只看该作者
windoze 发表于 2016-04-05 09:51
回复 4# zhujiang73

glibmm 2.4……这哪儿是遗留代码,这分明就是出土文物……8年了……一个抗战都打完 ...


    查到了这个:  http://ftp.gnome.org/pub/GNOME/s ... ibmm-2.45.2.changes

    但是 ubuntu 15.10 里的是 Version: 2.45.41.is.2.44.0-0ubuntu2  

2015-05-03  Kjell Ahlstedt  <kjell.ahlstedt@bredband.net>

        Glib::ObjectBase: Don't use std::auto_ptr

        * glib/glibmm/objectbase.[h|cc]: Use a plain pointer instead of std::auto_ptr.
        auto_ptr is deprecated in C++11, and can cause compilation warnings.
        Bug #748630.

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
7 [报告]
发表于 2016-04-05 17:40 |只看该作者
你们这是在研究什么哦,以前感觉boost是stl的大趋势,cpp粉直接用boost吧

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
8 [报告]
发表于 2016-04-05 17:57 |只看该作者
shang2010 发表于 2016-04-05 17:40
你们这是在研究什么哦,以前感觉boost是stl的大趋势,cpp粉直接用boost吧



     Boost 是不错,但是  Toolkit 里用什么不是我能决定的,胶水程序员就是赶上什么用什么。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
9 [报告]
发表于 2016-04-05 20:41 |只看该作者
回复 6# zhujiang73


2.4 vs 2.45,4 vs. 45……

45不是4.5啊同志!

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
10 [报告]
发表于 2016-04-05 21:08 |只看该作者
windoze 发表于 2016-04-05 20:41
回复 6# zhujiang73
  1. zhujiang@hp400:~$ dpkg -l  libglibmm-2.4-dev
  2. 期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
  3. | 状态=未安装(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)/触发器等待(W)/触发器未决(T)
  4. |/ 错误?=(无)/须重装(R) (状态,错误:大写=故障)
  5. ||/ 名称                         版本                体系结构:          描述
  6. +++-============================-===================-===================-==============================================================
  7. ii  libglibmm-2.4-dev:amd64      2.45.41.is.2.44.0-0 amd64               C++ wrapper for the GLib toolkit (development files)
复制代码
名称是 libglibmm-2.4-dev,版本是   2.45.41.is.2.44.0-0 amd64 。

      大概相当于一个人叫 “王二四”,这个“二四”是他的名字不是版本号。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP