需要说明的是,C++ 98 标准中有 auto_ptr 这种智能指针,但因为其存在所有权转移问题,以及不适用于容器的一些情况,因此在 C++ 11 标准以后就被废弃不再使用了。 我们通过代码示例来逐个学习,清楚了解它们的特性以及局限性。 unique_ptr: unique_ptr 是一...
在C++开发中,为了尽可能的避免内存泄漏,自C++11起引入了smart pointer,常见的有shared_ptr、weak_ptr以及unique_ptr等(auto_ptr已经被废弃),其中weak_ptr是为了解决循环引用而存在,其往往与shared_ptr结合使用。 下面,我们看一段代码: class Controller { public: Controller() = default; ~Controller() { std::...
首先,我要声明auto_ptr是一个坑!auto_ptr是一个坑!auto_ptr是一个坑!重要的事情说三遍!!! 通过上文,我们知道智能指针通过对象管理指针,在构造对象时完成资源的分配及初始化,在析构对象时完成资源的清理及汕尾工作. 因此,可以得到一份简洁版的智能指针代码: 大致一看,没毛病!
他们的功能其实很类似STL中的autoptr, 但是这里因为针对不同的分配对象而用了3个不同的类,其中CAutoVectorPtr是针对数组类型的,CAutoPtr是针对普通的非数组类型,而CAutoStackPtr针对的是_malloca分配的类型,因为最后释放方式的不同,它这里用了3份代码来实现。
注:std::auto_ptr 已被废弃。 共享指针(shared_ptr):资源可以被多个指针共享,使用计数机制表明资源被几个指针共享。通过 use_count() 查看资源的所有者的个数,可以通过 unique_ptr、weak_ptr 来构造,调用 release() 释放资源的所有权,计数减一,当计数减为 0 时,会自动释放内存空间,从而避免了内存泄漏。
auto_ptr ptr2 = ptr1; cout << ptr2 << endl; cout << ptr1 << endl; ``` 运行结果: 可以看到在ptr2和ptr1指向同一块地址后,ptr1变为了nullPtr,这种情况是一种强制性的,ptr1是不可预知的,可能导致一些很严重的bug,这也是在C++ 11后被废弃的原因之一。 为了防止这种强制退出的问题,于是推出了uniqu...
此外,CAutoPtr的复制构造函数和赋值运算符转移指针的所有权,将源指针复制到目标指针,并将源指针设置为 NULL。 这就是为什么不可能有两CAutoPtr个对象每个存储同一个指针的原因,并减少了删除同一指针两次的可能性。 CAutoPtr还简化了指针集合的创建。 创建CAutoPtr对象的集合更简单,而不是派生集合并重写析构函数。
在调试版本中,如果 CAutoVectorPtr::m_p 成员变量当前指向现有值,则会发生断言失败;也就是说,它不等于 NULL。CAutoVectorPtr::CAutoVectorPtr构造函数。复制 CAutoVectorPtr() throw(); explicit CAutoVectorPtr(T* p) throw(); CAutoVectorPtr(CAutoVectorPtr<T>& p) throw(); ...
16.13 泛型指针auto_ptr 书名:高质量程序设计指南:C++/C语言 作者名:林锐 韩永泉编著 本章字数:396字 更新时间:2020-08-27 02:46:47首页 书籍详情 目录 听书 加入书架 字号 背景 手机阅读举报 后续精彩内容,上QQ阅读APP免费读上QQ阅读APP看本书,新人免费读10天账号和设备都新为新人...
p CAutoVectorPtr 物件將會使用這個指標擁有權。備註當CAutoVectorPtr 物件接受指標的擁有權,自動刪除指標和所有配置的資料,會在超出範圍。如果 CAutoVectorPtr::Detach 再次呼叫,讓這個程式設計人員釋放所有配置資源的責任。在偵錯組建中,判斷提示失敗,則會產生 CAutoVectorPtr::m_p 成員變數目前指向現有的值;也就...