读书人

auto_ptr智能指针合适啥时候用?要注意

发布时间: 2012-06-20 20:37:21 作者: rapoo

auto_ptr智能指针适合啥时候用?要注意些啥?
auto_ptr <类型> p (new过的指针)

主问 此类指针适合什么场合用 ?
副问 用的时候要注意什么?

我目前只知道 . 和 ->的不同,两个 智能指针不能同时 指向一个 new过的指针。..

[解决办法]
auto_ptr不能共享所有权

auto_ptr<A> ptrA(new A);
auto_ptr<B> ptrB = ptrA; //要注意这种情况

可以使用boost的shard_ptr
[解决办法]
Effective STL的条款
8:永不建立auto_ptr的容器
关于此可以看的Effective STL的条款8

因为auto_ptr并不是完美无缺的,它的确很方便,但也有缺陷,在使用时要注意避免。首先,不要将auto_ptr对象作为STL容器的元素。C++标准明确禁止这样做,否则可能会碰到不可预见的结果

auto_ptr的另一个缺陷是将数组作为auto_ptr的参数: auto_ptr<char> pstr (new char[12] ); //数组;为定义
然后释放资源的时候不知道到底是利用delete pstr,还是 delete[] pstr;

然后收集了关于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放入容器

[解决办法]

C/C++ code
  // 示例 (a):        void fun()    {      T* pt( new T );       /*...假设这里return ;(不执行后面的delete),...*/      delete pt;    }     // 示例 (b)     void fun()    {      auto_ptr<T> pt( new T );       /*...  ...*/     } //  当pt出了作用域时析构函数被调用,      // 从而对象被自动删除
[解决办法]
参考:
使用auto_ptr需要注意的事项

应该很全了。

如果想高清auto_ptr的原理,可以参考:
动态分配资源的自动释放 - auto_ptr的实现原理
[解决办法]
探讨

主问 此类指针适合什么场合用 ?

求举例

[解决办法]
探讨

引用:

主问 此类指针适合什么场合用 ?

求举例


在代码块{}中,不想手动释放堆内存时,可以利用auto_ptr的析构函数(代码块结束时,自动调用它的析构函数)来释放对内存。

感觉用处不大。

读书人网 >C++

热点推荐