C++-智能指针和容器问题

C++-智能指针和容器问题

虐人心 发布于 2017-05-21 字数 135 浏览 1246 回复 4

标准库中的auto_ptr 不能用于容器中,那如果想在容器中保存smart_pointer类的对象,用哪一种smart pointer呢? 自己写一个??请大家指点

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

甜柠檬 2017-09-27 4 楼

auto_ptr的位置确实有点尴尬。这篇文章auto_ptr到底能不能作为容器的元素?
做了分析,在实现的时候可以参考一下

泛泛之交 2017-09-24 3 楼

不要将auto_ptr对象作为STL容器的元素,C++标准明确禁止这样做,虽然它的确很方便,但也有缺陷。我收集了关于auto_ptr的几种注意事项:
1、auto_ptr不能共享所有权。
2、auto_ptr不能指向数组
3、auto_ptr不能作为容器的成员。
4、不能通过赋值操作来初始化auto_ptr
std::auto_ptr<int> p(new int(42)); //OK
std::auto_ptr<int> p = new int(42); //ERROR
这是因为auto_ptr 的构造函数被定义为了explicit
5、不要把auto_ptr放入容器

建议用可以用shared_ptr来当作auto_ptr的替代方案(shared_ptr在Vs2005中已经内置了,当然也可以通过boost来使用),他有以下优点
1. shared_ptr就是为了解决auto_ptr在对象所有权上的局限性(auto_ptr是独占的),在使用引用计数的机制上提供了可以共享所有权的智能指针.
2. shared_ptr比auto_ptr更安全
3. shared_ptr是可以拷贝和赋值的,拷贝行为也是等价的,并且可以被比较,这意味这它可被放入标准库的一般容器(vector,list)和关联容器中(map)。

清晨说ぺ晚安 2017-07-09 2 楼

容器中支持通用类型的吧,auto_ptr能保存在容器中的,比如vector<CAutoPtr>。

泛泛之交 2017-05-22 1 楼

auto_ptr进行operator=和copy construct 的时候都会把right value对象的指针关联去掉,
即以前的right value每次操作后,管理对象都发生了改动,right value已经为无效的auto_ptr
了。因为这个双刃特性,决定了auto_ptr只能做非常简单的应用。如果一个指针需要多个智能指针管理,可以选用smart_ptr