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的实现原理
[解决办法]
[解决办法]