C++内存管理学习笔记(4) (三)

2014-11-24 00:56:18 · 作者: · 浏览: 15
ew int(1024); // error: cannot assign a pointer to an auto_ptr 8: if (p_auto.get()) 9: *p_auto = 1024; 10: else 11: p_auto.reset(new int(1042)); 12: return 1; 13: }
正如自身赋值是没有效果的一样,如果调用该 auto_ptr 对象已经保存的同一指针的 reset 函数,也没有效果,不会删除对象。

(12)正确使用auto_ptr类的限制(auto_ptr的缺陷)

1)不要使用auto_ptr对象保存指向静态分配对象的指针,否则,当auto_ptr对象本身被撤销的时候,它将试图删除指向非动态分配对象的指针,导致未定义的行为。

2)永远不要使用两个 auto_ptrs 对象指向同一对象,导致这个错误的一种明显方式是,使用同一指针来初始化或者 reset 两个不同的 auto_ptr对象。另一种导致这个错误的微妙方式可能是,使用一个 auto_ptr 对象的 get 函数的结果来初始化或者 reset另一个 auto_ptr 对象。

3)不要使用 auto_ptr 对象保存指向动态分配数组的指针。当auto_ptr 对象被删除的时候,它只释放一个对象—它使用普通delete 操作符,而不用数组的 delete [] 操作符。

4)不要将 auto_ptr 对象存储在容器中。容器要求所保存的类型定义复制和赋值操作符,使它们表现得类似于内置类型的操作符:在复制(或者赋值)之后,两个对象必须具有相同值,auto_ptr 类不满足这个要求。

讲到这里,相信大家对智能指针中的auto_ptr对象有了清晰的认识,想多研究或者学习的请自行查找资料。文章中详细解释智能指针auto_ptr,一是为了对第一规则RAII的理解,二是为了对智能指针有个清晰的认识,怎么使用,注意些什么等等,三是为了对学习笔记后续中strong pointer等知识的理解。

如果你认为文章内容有不正确或者不准确的地方,请指出。互相学习!

参考文献详见《c++内存管理学习纲要》一文;

--------------------------------------------------------------------------------


PS:学习是延伸的,这个我毫不怀疑!文章主线是对C++中的健壮指针和资源管理的学习,在学习过程中不断延伸到各个知识点,比如c++中的模板和泛型编程,c++标准库中的智能指针,STL中相关部分的实现等等,这些需要读者自己学习了。