C++智能指针

合集下载

C++ 11智能指针之shared_ptr

C++ 11智能指针之shared_ptr

【原】C++ 11智能指针之shared_ptrshared_ptr是一个引用计数智能指针,用于共享对象的所有权。

它可以从一个裸指针、另一个shared_ptr、一个auto_ptr、或者一个weak_ptr构造。

还可以传递第二个参数给shared_ptr的构造函数,它被称为删除器(deleter)。

删除器用于处理共享资源的释放,这对于管理那些不是用new分配也不是用delete释放的资源时非常有用。

shared_ptr 被创建后,就可以像普通指针一样使用了,除了一点,它不能被显式地删除。

shared_ptr的比较重要的接口如下:template <class T>explicit shared_ptr(T* p);这个构造函数获得给定指针p的所有权。

参数p必须是指向T的有效指针。

构造后引用计数设为1。

唯一从这个构造函数抛出的异常是std::bad_alloc(仅在一种很罕见的情况下发生,即不能获得引用计数器所需的空间)。

template <class T,class D>shared_ptr(T* p,D d);这个构造函数带有两个参数。

第一个是shared_ptr将要获得所有权的那个资源,第二个是shared_ptr被销毁时负责释放资源的一个对象,被保存的资源将以d(p)的形式传给那个对象。

如果引用计数器不能分配成功,shared_ptr 抛出一个类型为std::bad_alloc的异常。

shared_ptr(const shared_ptr& r);r中保存的资源被新构造的shared_ptr所共享,引用计数加一。

这个构造函数不会抛出异常。

template <class T>explicit shared_ptr(const weak_ptr<T>& r);从一个weak_ptr构造shared_ptr。

这使得weak_ptr的使用具有线程安全性,因为指向weak_ptr参数的共享资源的引用计数将会自增(weak_ptr不影响共享资源的引用计数)。

c语言内存泄漏的解决方法

c语言内存泄漏的解决方法

c语言内存泄漏的解决方法
在C语言中,内存泄漏是一个常见的问题。

内存泄漏是指在程序中分配的内存没有在不再需要时被释放,导致内存被浪费。

下面是一些解决C语言内存泄漏的方法:
1. 使用智能指针:智能指针是一种自动管理内存的指针,它可以自动释放所指向的内存。

在C++中,可以使用智能指针来避免内存泄漏。

在C语言中,可以使用类似的智能指针库,例如Boehm-Demers-Weiser垃圾回收器。

2. 手动释放内存:在C语言中,内存分配和释放需要手动进行。

在使用完
动态分配的内存后,应该及时使用free()函数释放内存。

为了避免忘记释放内存,可以使用一些工具和技术来帮助检测和定位内存泄漏。

3. 使用内存检查工具:有一些工具可以帮助检测C语言程序的内存泄漏,
例如Valgrind、Dr. Memory等。

这些工具可以在程序运行时检测到哪些
内存没有被释放,并给出详细的报告和定位信息。

4. 避免全局变量和静态变量:全局变量和静态变量会在程序整个运行期间占用内存,如果过多使用全局变量和静态变量,可能会导致内存泄漏。

因此,应该尽量避免使用全局变量和静态变量。

5. 使用适当的内存管理方式:根据具体情况选择合适的内存管理方式可以有效地减少内存泄漏。

例如,使用动态内存分配可以方便地分配和释放内存,
但如果使用不当可能导致内存泄漏;使用栈内存分配可以避免内存泄漏,但需要注意栈溢出等问题。

总之,解决C语言内存泄漏需要从多个方面入手,包括使用智能指针、手动释放内存、使用内存检查工具、避免全局变量和静态变量以及使用适当的内存管理方式等。

C++语言选择题40道:C++智能指针:auto_ptr

C++语言选择题40道:C++智能指针:auto_ptr

C++智能指针试题1.auto_ptr在C++11中被标记为已弃用,主要因为它具有哪个性质导致资源管理混乱?o A. 所有权转移时的浅拷贝o B. 可以显式释放资源o C. 强制类型转换的构造函数o D. 没有引用计数答案: A解析: auto_ptr在拷贝构造和赋值操作时,仅进行所有权转让,而不是深拷贝,这可能导致原对象的资源被释放后,新对象仍试图使用已被释放的资源,造成悬挂指针。

2.假设有一个unique_ptr对象uptr,以下哪个操作是非法的?o A. uptr->func();o B. (*uptr).func();o C. uptr = nullptr;o D. uptr = uptr;答案: D解析: unique_ptr不允许自我赋值,因为这会导致资源管理混乱,即两次释放相同的资源。

3.shared_ptr的主要优势是什么?o A. 自动管理资源的生命周期o B. 所有权的唯一性o C. 可以在不同线程间安全地传递o D. 消耗的资源比auto_ptr和unique_ptr少答案: A解析: shared_ptr通过引用计数管理资源的生命周期,当引用计数为0时自动释放资源,从而允许多个shared_ptr实例共享相同的资源。

4.以下哪项描述了unique_ptr和shared_ptr之间的一个关键区别?o A. unique_ptr可以使用new[]分配的数组o B. shared_ptr可以被复制和转移o C. unique_ptr支持任意类型o D. shared_ptr的析构函数是公有的答案: B解析: unique_ptr不支持复制和转移所有权,而shared_ptr通过引用计数机制支持复制和所有权的共享。

5.在以下代码片段中,ptr指向的对象何时被销毁?o B. 当weakPtr离开作用域时o C. 当ptr引用计数变为0时o D. 代码编译错误,无法执行答案: C解析: shared_ptr在引用计数为0时会释放资源,当ptr被赋值为weakPtr (实质上是一个shared_ptr)时,原ptr指向的对象的引用计数变为0。

智能指针get函数

智能指针get函数

智能指针get函数1. 智能指针简介智能指针是一种用于管理动态资源的工具,它能够自动地进行资源分配和释放,避免了手动管理内存的复杂性和错误。

智能指针通过包装指针并在其生命周期结束时自动调用析构函数来释放资源。

2. 智能指针的种类目前常见的智能指针包括:unique_ptr、shared_ptr和weak_ptr。

2.1 unique_ptrunique_ptr是C++11新增的一种独占型智能指针,它只能指向一个对象。

当unique_ptr被析构时,它所指向的对象也会被销毁。

unique_ptr使用delete操作符来释放指针所指向的对象。

2.2 shared_ptrshared_ptr是一种共享型智能指针,它可以被多个shared_ptr共享所有权。

它使用引用计数来追踪有多少个shared_ptr指向相同的对象。

当没有任何shared_ptr 指向该对象时,该对象会被销毁。

shared_ptr使用delete操作符来释放指针所指向的对象。

2.3 weak_ptrweak_ptr是一种弱引用智能指针,它指向一个被shared_ptr管理的对象,但不会增加引用计数。

weak_ptr通常用于防止循环引用,当所有的shared_ptr释放后,weak_ptr会自动失效。

3. 智能指针get函数的作用在使用智能指针时,我们有时需要获取原始指针以进行与智能指针无关的操作。

这时候可以使用智能指针的get函数来获取原始指针。

get函数是一个非成员函数,用于返回智能指针中保存的原始指针。

通过get函数获取的原始指针无法进行自动释放,需要手动释放资源。

因此,我们应该谨慎使用get函数,并确保手动释放资源以避免内存泄露。

4. 使用智能指针get函数的注意事项在使用智能指针的get函数时,需要注意以下几个方面:4.1 避免手动释放资源由于get函数返回的是一个原始指针,它无法自动释放资源。

因此,在使用get函数获取原始指针后,需要格外小心,确保手动释放资源,以避免内存泄露。

C++智能指针shared_ptr

C++智能指针shared_ptr

C++智能指针shared_ptrC++智能指针 shared_ptr shared_ptr 是⼀个标准的共享所有权的智能指针, 允许多个指针指向同⼀个对象. 定义在 memory ⽂件中(⾮memory.h), 命名空间为 std. shared_ptr 是为了解决 auto_ptr 在对象所有权上的局限性(auto_ptr 是独占的), 在使⽤引⽤计数的机制上提供了可以共享所有权的智能指针, 当然这需要额外的开销: (1) shared_ptr 对象除了包括⼀个所拥有对象的指针外, 还必须包括⼀个引⽤计数代理对象的指针. (2) 时间上的开销主要在初始化和拷贝操作上, *和->操作符重载的开销跟auto_ptr是⼀样. (3) 开销并不是我们不使⽤shared_ptr的理由, 永远不要进⾏不成熟的优化, 直到性能分析器告诉你这⼀点. 使⽤⽅法:可以使⽤模板函数 make_shared 创建对象, make_shared 需指定类型('<>'中)及参数('()'内), 传递的参数必须与指定的类型的构造函数匹配. 如: std::shared_ptr<int> sp1 = std::make_shared<int>(10); std::shared_ptr<std::string> sp2 = std::make_shared<std::string>("Hello c++");也可以定义 auto 类型的变量来保存 make_shared 的结果. auto sp3 = std::make_shared<int>(11); printf("sp3=%d\n", *sp3); auto sp4 = std::make_shared<std::string>("C++11"); printf("sp4=%s\n", (*sp4).c_str());成员函数use_count 返回引⽤计数的个数unique 返回是否是独占所有权( use_count 为 1)swap 交换两个 shared_ptr 对象(即交换所拥有的对象)reset 放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引⽤计数的减少get 返回内部对象(指针), 由于已经重载了()⽅法, 因此和直接使⽤对象是⼀样的.如 shared_ptr<int> sp(new int(1)); sp 与 sp.get()是等价的以下代码演⽰各个函数的⽤法与特点:std::shared_ptr<int> sp0(new int(2));std::shared_ptr<int> sp1(new int(11));std::shared_ptr<int> sp2 = sp1;printf("%d\n", *sp0); // 2printf("%d\n", *sp1); // 11printf("%d\n", *sp2); // 11sp1.swap(sp0);printf("%d\n", *sp0); // 11printf("%d\n", *sp1); // 2printf("%d\n", *sp2); // 11std::shared_ptr<int> sp3(new int(22));std::shared_ptr<int> sp4 = sp3;printf("%d\n", *sp3); // 22printf("%d\n", *sp4); // 22sp3.reset();printf("%d\n", e_count()); // 0printf("%d\n", e_count()); // 1printf("%d\n", sp3); // 0printf("%d\n", sp4); // 指向所拥有对象的地址std::shared_ptr<int> sp5(new int(22));std::shared_ptr<int> sp6 = sp5;std::shared_ptr<int> sp7 = sp5;printf("%d\n", *sp5); // 22printf("%d\n", *sp6); // 22printf("%d\n", *sp7); // 22printf("%d\n", e_count()); // 3printf("%d\n", e_count()); // 3printf("%d\n", e_count()); // 3sp5.reset(new int(33));printf("%d\n", e_count()); // 1printf("%d\n", e_count()); // 2printf("%d\n", e_count()); // 2printf("%d\n", *sp5); // 33printf("%d\n", *sp6); // 22printf("%d\n", *sp7); // 22 auto r = std::make_shared<int>(); // r 的指向的对象只有⼀个引⽤, 其 use_count == 1 auto q = r; (或auto q(r);) // 给 r 赋值, 令其指向另⼀个地址, q 原来指向的对象的引⽤计数减1(如果为0, 释放内存), r指向的对象的引⽤计数加1, 此时 q 与 r 指向同⼀个对象, 并且其引⽤计数相同, 都为原来的值加1.以下⾯的代码测试:std::shared_ptr<int> sp1 = std::make_shared<int>(10);std::shared_ptr<int> sp2 = std::make_shared<int>(11);auto sp3 = sp2; 或 auto sp3(sp2);printf("e_count = %d\n", e_count()); // 1printf("e_count = %d\n", e_count()); // 2printf("e_count = %d\n", e_count()); // 2sp3 = sp1;printf("e_count = %d\n", e_count()); // 2printf("e_count = %d\n", e_count()); // 1printf("e_count = %d\n", e_count()); // 2何时需要使⽤ shared_ptr ?(1) 程序不知道⾃⼰需要使⽤多少对象. 如使⽤窗⼝类, 使⽤ shared_ptr 为了让多个对象能共享相同的底层数据.std::vector<std::string> v1; // ⼀个空的 vector// 在某个新的作⽤域中拷贝数据到 v1 中{std::vector<std::string> v2;v2.push_back("a");v2.push_back("b");v2.push_back("c");v1 = v2;} // 作⽤域结束时 v2 被销毁, 数据被拷贝到 v1 中(2) 程序不知道所需对象的准确类型.(3) 程序需要在多个对象间共享数据.⾃定义释放器(函数) ⾃定义释放器(函数), 它能完成对 shared_ptr 中保存的指针进⾏释放操作, 还能处理 shared_ptr 的内部对象未完成的部分⼯作. 假设如下是⼀个连接管理类, 此类由于历史原因, ⽆法在析构函数中进⾏断开连接, 此时⽤⾃定义的释放器可以很好的完成此⼯作: class CConnnect{void Disconnect() { PRINT_FUN(); }};void Deleter(CConnnect* obj){obj->Disconnect(); // 做其它释放或断开连接等⼯作delete obj; // 删除对象指针}std::shared_ptr<CConnnect> sps(new CConnnect, Deleter);使⽤ shared_ptr 的注意事项(1) shared_ptr 作为被保护的对象的成员时, ⼩⼼因循环引⽤造成⽆法释放资源. 假设 a 对象中含有⼀个 shared_ptr<CB> 指向 b 对象, b 对象中含有⼀个 shared_ptr<CA> 指向 a 对象, 并且 a, b 对象都是堆中分配的。

C++11unique_ptr智能指针详解

C++11unique_ptr智能指针详解

C++11unique_ptr智能指针详解在《》的基础上,本节继续讲解 C++11 标准提供的另⼀种智能指针,即 unique_ptr 智能指针。

作为智能指针的⼀种,unique_ptr 指针⾃然也具备“在适当时机⾃动释放堆内存空间”的能⼒。

和 shared_ptr 指针最⼤的不同之处在于,unique_ptr 指针指向的堆内存⽆法同其它 unique_ptr 共享,也就是说,每个 unique_ptr 指针都独⾃拥有对其所指堆内存空间的所有权。

这也就意味着,每个 unique_ptr 指针指向的堆内存空间的引⽤计数,都只能为 1,⼀旦该 unique_ptr 指针放弃对所指堆内存空间的所有权,则该空间会被⽴即释放回收。

unique_ptr 智能指针是以模板类的形式提供的,unique_ptr<T>(T 为指针所指数据的类型)定义在<memory>头⽂件,并位于 std 命名空间中。

因此,要想使⽤ unique_ptr 类型指针,程序中应⾸先包含如下 2 条语句:1. #include <memory>2. using namespace std;第 2 句并不是必须的,可以不添加,则后续在使⽤ unique_ptr 指针时,必须标注std::。

unique_ptr智能指针的创建考虑到不同实际场景的需要,unique_ptr<T> 模板类提供了多个实⽤的构造函数,这⾥给读者列举了⼏种常⽤的构造 unique_ptr 智能指针的⽅式。

1) 通过以下 2 种⽅式,可以创建出空的 unique_ptr 指针:1. std::unique_ptr<int> p1();2. std::unique_ptr<int> p2(nullptr);2) 创建 unique_ptr 指针的同时,也可以明确其指向。

例如:1. std::unique_ptr<int> p3(new int);由此就创建出了⼀个 p3 智能指针,其指向的是可容纳 1 个整数的堆存储空间。

C++面试常见100题

C++面试常见100题

C++面试常见100题1. 什么是C ++?它的优点是什么?2. C++和C的主要区别是什么?3. C++的基本语法、数据类型和控制结构?4. 定义和使用指针。

5. 定义和使用引用。

6. 什么是类?类的组成成分是什么?7. 什么是继承?派生类可以访问基类的哪些成员?8. 什么是多态?虚函数的作用?9. 什么是纯虚函数?10. 什么是数据封装?为什么需要数据封装?11. 什么是构造函数和析构函数?它们的作用是什么?12. 什么是拷贝构造函数和拷贝赋值运算符?它们的作用是什么?13. C++中的运算符重载和函数重载有什么区别?14. 什么是友元函数和友元类?15. 什么是异常处理?C++中的异常处理机制是什么?16. 什么是RAII?17. 什么是模板类和模板函数?18. STL中的容器、算法和迭代器有哪些?19. 什么是智能指针?20. 什么是虚拟函数?为什么需要虚拟函数?21. 什么是纯虚函数?为什么需要纯虚函数?22. 什么是多重继承?23. 什么是模板特化?24. C++中的多线程有哪些特点?25. Linux下如何使用多线程?26. 什么是死锁?如何避免死锁?27. 什么是进程和线程?它们的区别是什么?28. 什么是信号和信号处理?29. 什么是文件操作?C++中的文件操作函数有哪些?30. 什么是网络编程?C++中的网络编程函数有哪些?31. 什么是数据库操作?C++中的数据库操作函数有哪些?32. 什么是多态?如何实现多态?33. C++中有哪些常用的设计模式?34. 如何进行性能优化?35. C++11和C++14中的新特性有哪些?36. const关键字的作用是什么?37. static关键字的作用是什么?38. inline关键字的作用是什么?39. sizeof运算符的作用是什么?40. C++中的数据类型有哪些?它们的区别是什么?41. 什么是指针和引用?42. 什么是动态内存分配?C++中的动态内存分配函数有哪些?43. 什么是类和对象?如何定义和使用类和对象?44. 什么是构造函数和析构函数?它们的作用是什么?45. 什么是拷贝构造函数和拷贝赋值运算符?它们的作用是什么?46. C++中的运算符重载和函数重载有什么区别?47. 什么是友元函数和友元类?48. 什么是异常处理?C++中的异常处理机制是什么?49. 什么是RAII?50. 什么是模板类和模板函数?51. STL中的容器、算法和迭代器有哪些?52. 什么是智能指针?53. 什么是虚拟函数?为什么需要虚拟函数?54. 什么是纯虚函数?为什么需要纯虚函数?55. 什么是多重继承?56. 什么是模板特化?57. C++中的多线程有哪些特点?58. Linux下如何使用多线程?59. 什么是死锁?如何避免死锁?60. 什么是进程和线程?它们的区别是什么?61. 什么是信号和信号处理?62. 什么是文件操作?C++中的文件操作函数有哪些?63. 什么是网络编程?C++中的网络编程函数有哪些?64. 什么是数据库操作?C++中的数据库操作函数有哪些?65. 什么是多态?如何实现多态?66. C++中有哪些常用的设计模式?67. 如何进行性能优化?68. C++11和C++14中的新特性有哪些?69. const关键字的作用是什么?70. static关键字的作用是什么?71. inline关键字的作用是什么?72. sizeof运算符的作用是什么?73. C++中的数据类型有哪些?它们的区别是什么?74. 什么是指针和引用?75. 什么是动态内存分配?C++中的动态内存分配函数有哪些?76. 什么是类和对象?如何定义和使用类和对象?77. 什么是构造函数和析构函数?它们的作用是什么?78. 什么是拷贝构造函数和拷贝赋值运算符?它们的作用是什么?79. C++中的运算符重载和函数重载有什么区别?80. 什么是友元函数和友元类?81. 什么是异常处理?C++中的异常处理机制是什么?82. 什么是RAII?83. 什么是模板类和模板函数?84. STL中的容器、算法和迭代器有哪些?85. 什么是智能指针?86. 什么是虚拟函数?为什么需要虚拟函数?87. 什么是纯虚函数?为什么需要纯虚函数?88. 什么是多重继承?89. 什么是模板特化?90. C++中的多线程有哪些特点?91. Linux下如何使用多线程?92. 什么是死锁?如何避免死锁?93. 什么是进程和线程?它们的区别是什么?94. 什么是信号和信号处理?95. 什么是文件操作?C++中的文件操作函数有哪些?96. 什么是网络编程?C++中的网络编程函数有哪些?97. 什么是数据库操作?C++中的数据库操作函数有哪些?98. 什么是多态?如何实现多态?99. C++中有哪些常用的设计模式?100. 如何进行性能优化?。

将智能指针变量 存储到数组中的方法

将智能指针变量 存储到数组中的方法

智能指针是C++语言中一种非常重要的数据类型,它可以帮助程序员管理动态内存分配,并且能够自动释放内存,有效避免内存泄漏的问题。

在实际的编程工作中,有时我们会需要将智能指针变量存储到数组中,以便于对多个指针进行统一管理和操作。

本文将介绍如何将智能指针变量存储到数组中的方法。

1. 使用std::vectorstd::vector是C++标准库中的一个容器类模板,它可以存储各种类型的数据,并且能够动态调整大小。

我们可以利用std::vector来存储智能指针变量,实现对多个指针的统一管理。

我们需要包含< vector>头文件:```cpp#include <vector>```我们定义一个std::vector对象,存储智能指针变量:```cppstd::vector<std::shared_ptr<int>> ptrArray;```在这个例子中,我们使用了std::shared_ptr作为智能指针的类型,存储了int类型的数据。

当然,你也可以选择其他类型的智能指针,如std::unique_ptr或者std::weak_ptr,根据实际情况来选择。

接下来,我们可以向ptrArray中添加智能指针变量:```cppptrArray.push_back(std::make_shared<int>(10));ptrArray.push_back(std::make_shared<int>(20));```通过调用push_back方法,我们可以将智能指针变量添加到ptrArray 中。

这样,我们就实现了将多个智能指针变量存储到数组中的目的。

2. 使用普通指针数组除了使用std::vector外,我们还可以使用普通指针数组来存储智能指针变量。

在实际编程中,这种方法可能会更加高效。

我们定义一个指针数组:```cppstd::shared_ptr<int>* ptrArray = new std::shared_ptr<int>[10]; ```在这个例子中,我们定义了一个含有10个std::shared_ptr<int>类型的指针数组。

智能指针swap用法

智能指针swap用法

智能指针swap用法智能指针是现代C++编程中不可或缺的一个工具。

在C++11中引入的智能指针,尤其是std::unique_ptr和std::shared_ptr,为我们处理动态内存分配提供了更加安全和方便的方式。

在使用智能指针时,我们有时需要将指针对象的所有权转移给另一个对象。

这时我们可以使用swap函数。

本文将介绍智能指针swap 用法,并为读者提供一些实际应用场景。

一、swap函数概述swap函数是C++ STL库中的一个重要函数,它用于交换两个对象的值。

使用swap函数可以避免对象复制带来的额外开销。

STL中的标准容器和迭代器都提供了swap函数的实现。

当我们使用智能指针时,swap函数可以将两个智能指针所指对象的所有权交换。

这意味着,swap函数可以将一个智能指针指向的对象的所有权转移给另一个智能指针对象。

二、智能指针swap用法std::unique_ptr和std::shared_ptr都提供了swap函数。

具体用法如下:// std::unique_ptr swapstd::unique_ptr<int> ptr1(new int(10));std::unique_ptr<int> ptr2(new int(20));ptr1.swap(ptr2);// std::shared_ptr swapstd::shared_ptr<int> ptr3(new int(30));std::shared_ptr<int> ptr4(new int(40));ptr3.swap(ptr4);在上述代码中,ptr1和ptr2是两个std::unique_ptr对象,它们所指向的对象的所有权可以通过swap函数互相传递。

ptr3和ptr4是两个std::shared_ptr对象,它们所指向的对象同样可以通过swap函数进行所有权交换。

值得注意的是,智能指针swap函数并不进行内存复制或移动。

智能指针get函数

智能指针get函数

智能指针get函数智能指针是一种可以自动管理内存的指针,它可以自动释放内存,避免了手动管理内存带来的许多问题。

其中,get函数是智能指针中一个非常重要的函数,它用于获取指向所管理对象的原始指针。

本文将详细介绍智能指针中的get函数。

一、什么是智能指针在C++中,我们通常使用new关键字来申请堆上的内存空间,并通过返回一个指向该空间的指针来使用该空间。

但是,在使用完这个空间后我们也需要手动释放这个空间,否则就会出现内存泄漏等问题。

而智能指针则可以自动管理这些问题。

智能指针是一种模板类,它将一个原始指针封装在一个对象中,并提供了一些成员函数来自动管理这个原始指针。

智能指针最常见的两种实现方式是shared_ptr和unique_ptr。

二、shared_ptr和unique_ptrshared_ptr和unique_ptr都实现了RAII(资源获取即初始化)技术,即在构造函数中获取资源,在析构函数中释放资源。

二者之间最大的区别在于所有权。

1. shared_ptrshared_ptr是共享所有权的智能指针。

多个shared_ptr对象可以同时拥有同一个原始指针,当最后一个shared_ptr对象析构时,它会自动释放所管理的内存空间。

shared_ptr的构造函数和析构函数非常简单,使用起来也非常方便。

例如:```std::shared_ptr<int> p(new int(10)); //创建一个指向int类型的共享指针```2. unique_ptrunique_ptr是独占所有权的智能指针。

每个unique_ptr对象都拥有它所管理的内存空间的唯一所有权,不能被复制或共享。

当unique_ptr对象被销毁时,它会自动释放所管理的内存空间。

unique_ptr也非常简单易用。

例如:```std::unique_ptr<int> p(new int(10)); //创建一个指向int类型的独占指针```三、智能指针中的get函数get函数是智能指针中一个非常重要的函数,它用于获取指向所管理对象的原始指针。

C++智能指针用法详解

C++智能指针用法详解

C++智能指针⽤法详解⼀、简介由于 C++ 语⾔没有⾃动内存回收机制,程序员每次 new 出来的内存都要⼿动 delete。

程序员忘记 delete,流程太复杂,最终导致没有delete,异常导致程序过早退出,没有执⾏ delete 的情况并不罕见。

⽤智能指针便可以有效缓解这类问题,本⽂主要讲解常见的智能指针的⽤法。

包括:std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_array、boost::shared_array、boost::weak_ptr、boost:: intrusive_ptr。

你可能会想,如此多的智能指针就为了解决new、delete匹配问题,真的有必要吗?看完这篇⽂章后,我想你⼼⾥⾃然会有答案。

下⾯就按照顺序讲解如上 7 种智能指针(smart_ptr)。

⼆、具体使⽤1、总括(1)对于编译器来说,智能指针实际上是⼀个栈对象,并⾮指针类型,在栈对象⽣命期即将结束时,智能指针通过析构函数释放由它管理的堆内存;(2)所有智能指针都重载了“operator->”操作符,直接返回对象的引⽤,⽤以操作对象(参见);(3)访问智能指针原来的⽅法则使⽤“.”操作符;(4)访问智能指针包含的裸指针则可以⽤ get() 函数;(5)由于智能指针是⼀个对象,所以if (my_smart_object)永远为真,要判断智能指针的裸指针是否为空,需要这样判断:if(my_smart_object.get())。

(6)智能指针包含了 reset() ⽅法,如果不传递参数(或者传递 NULL),则智能指针会释放当前管理的内存。

如果传递⼀个对象,则智能指针会释放当前对象,来管理新传⼊的对象。

⾸先,我们编写⼀个测试类来辅助分析:class Simple {public:Simple(int param = 0){number = param;std::cout << "Simple: " << number << std::endl;}~Simple(){std::cout << "~Simple: " << number << std::endl;}void PrintSomething(){std::cout << "PrintSomething: " << info_extend.c_str() << std::endl;}std::string info_extend;int number;};2、std::auto_ptr——独占(《C++ Primer Plus》(第六版)中还有提及std::unique_ptr)std::auto_ptr 属于 STL,当然在 namespace std 中,包含头⽂件 #include<memory>便可以使⽤。

C内存管理智能指针与RAII的应用

C内存管理智能指针与RAII的应用

C内存管理智能指针与RAII的应用C语言是一门强大而受欢迎的编程语言,但它也因为缺乏自动内存管理而给开发者带来了很多困扰。

为了解决这一问题,C++引入了智能指针和资源获取即初始化(RAII)的概念。

在本文中,我们将讨论C 内存管理中智能指针和RAII的应用。

1. 智能指针的概念与使用智能指针是一个类模板,用于管理动态分配的内存。

它重载了指针操作符,能够像原始指针一样访问对象,同时在对象不再需要时自动释放所占用的内存。

在C++中,智能指针的典型代表是std::unique_ptr 和std::shared_ptr。

在C内存管理中,我们可以借鉴智能指针的概念来实现内存的自动管理。

通过定义一个结构体或者类来封装原始指针,并在析构函数中释放内存,我们可以实现类似于智能指针的功能。

下面是一个使用智能指针的例子:```c#include <stdio.h>#include <stdlib.h>typedef struct {int *data;} SmartPointer;SmartPointer *createSmartPointer(int value) {SmartPointer *sp = (SmartPointer *)malloc(sizeof(SmartPointer)); sp->data = (int *)malloc(sizeof(int));*(sp->data) = value;return sp;}void destroySmartPointer(SmartPointer *sp) {free(sp->data);free(sp);}int main() {SmartPointer *sp = createSmartPointer(10);printf("%d\n", *(sp->data));destroySmartPointer(sp);return 0;}```在这个例子中,我们使用一个SmartPoint结构体来封装原始指针,并在创建结构体时动态分配内存。

智能指针shared_ptr的用法

智能指针shared_ptr的用法

智能指针shared_ptr的⽤法 为了解决C++内存泄漏的问题,C++11引⼊了智能指针(Smart Pointer)。

智能指针的原理是,接受⼀个申请好的内存地址,构造⼀个保存在栈上的智能指针对象,当程序退出栈的作⽤域范围后,由于栈上的变量⾃动被销毁,智能指针内部保存的内存也就被释放掉了(除⾮将智能指针保存起来)。

C++11提供了三种智能指针:std::shared_ptr, std::unique_ptr, std::weak_ptr,使⽤时需添加头⽂件<memory>。

shared_ptr使⽤引⽤计数,每⼀个shared_ptr的拷贝都指向相同的内存。

每使⽤他⼀次,内部的引⽤计数加1,每析构⼀次,内部的引⽤计数减1,减为0时,删除所指向的堆内存。

shared_ptr内部的引⽤计数是安全的,但是对象的读取需要加锁。

1. shared_ptr的基本⽤法初始化 可以通过构造函数、std::make_shared<T>辅助函数和reset⽅法来初始化shared_ptr:#include "stdafx.h"#include <iostream>#include <future>#include <thread>using namespace std;class Person{public:Person(int v) {value = v;std::cout << "Cons" <<value<< std::endl;}~Person() {std::cout << "Des" <<value<< std::endl;}int value;};int main(){std::shared_ptr<Person> p1(new Person(1));// Person(1)的引⽤计数为1std::shared_ptr<Person> p2 = std::make_shared<Person>(2);p1.reset(new Person(3));// ⾸先⽣成新对象,然后引⽤计数减1,引⽤计数为0,故析构Person(1)// 最后将新对象的指针交给智能指针std::shared_ptr<Person> p3 = p1;//现在p1和p3同时指向Person(3),Person(3)的引⽤计数为2p1.reset();//Person(3)的引⽤计数为1p3.reset();//Person(3)的引⽤计数为0,析构Person(3)return0;} 注意,不能将⼀个原始指针直接赋值给⼀个智能指针,如下所⽰,原因是⼀个是类,⼀个是指针。

C++的String类及其成员函数和智能指针专题

C++的String类及其成员函数和智能指针专题

本文作者:黄邦勇帅本文是学习C++的附加内容,主要介绍了C++中的string类的各种成员函数,及成员函数的功能与作用,是作为学习C++的参考使用的。

本文内容完全属于个人见解与参考文现的作者无关,其中难免有误解之处,望指出更正。

声明:禁止抄袭本文,若需要转载本文请注明转载的网址,或者注明转载自“黄邦勇帅”。

主要参考文献:1、C++.Primer.Plus.第五版.中文版[美]Stephen Prata著孙建春韦强译人民邮电出版社2005年5月2、C++.Primer.Plus.第四版.中文版Stanley B.Lippman、Barbara E.Moo著李师贤等译人民邮电出版社2006年3月3、C++.Primer.Plus.第三版.中文版Stanley B.Lippman等著潘爱民张丽译中国电力出版社2002年5月4、C++入门经典第三版[美]Ivor Horton著李予敏译清华大学出版社2006年1月5、C++参考大全第四版[美]Herbert Schidt著周志荣朱德芳于秀山等译电子工业出版社2003年9月6、21天学通第四版C++ [美]Jesse Liberty著康博创作室译人民邮电出版社2002年3月第20章string类1、string类用于处理字符串,要使用string类需要包含string头文件。

2、注意string是一个类,它具有类的特性,也就是说string类有构造函数,有重载的操作符,有成员函数。

string对象可以自动调整大小,但有一些限制,string对象有个最大允许的长度,该长度由string类的静态常量string::nops设定,通常是最大的unsigned int值,在vc++中被设为-1。

3、string类是模板类basic_string类的char具体化版本,basic_string类的原型为:template<class charT, classtraits=char_traits<charT>, class Allocator=allocator<charT> > class basic_string{….}; 对于string类具有预定义的具体化版本typedef basic_string<char> string;也就是说string是basic_string模板类的char具体化版本的别名。

智能指针的循环引用

智能指针的循环引用

智能指针的循环引用智能指针的循环引用智能指针是 C++ 语言中的一个重要的概念,它可以自动管理动态内存分配和释放,有效避免内存泄漏和使用非法空指针等问题。

然而,在使用智能指针时,循环引用是一个常见的问题,可能会导致内存泄漏和程序崩溃等问题。

本文将介绍智能指针循环引用的原因、危害以及解决方法等内容。

一、循环引用的原因循环引用是指两个或多个对象相互持有对方的指针或引用,形成一个环状结构,导致内存无法正确释放。

在使用智能指针时,循环引用通常是由于以下原因造成:1. 对象之间的相互引用。

例如,类 A 持有类 B 的指针,同时类 B 也持有类 A 的指针,形成循环引用。

2. 继承关系的循环引用。

例如,类 A 继承自类 B,同时又将 B 作为自己的基类,形成循环引用。

3. 多个智能指针共同管理同一块动态内存区域。

例如,类 A 和类 B 都持有同一个智能指针(例如 shared_ptr),导致循环引用。

二、循环引用的危害循环引用可能会导致内存泄漏和程序崩溃等问题,其主要危害如下:1. 内存泄漏。

由于循环引用导致动态内存无法正确释放,导致内存泄漏。

2. 程序崩溃。

循环引用可能导致指针悬挂(dangling pointer)问题,即指针指向已释放的内存区域,导致程序崩溃。

三、解决循环引用的方法为了解决循环引用问题,可以采取以下方法:1. 使用弱引用。

弱引用是一种不增加对象引用计数的指针,可以避免循环引用。

例如,使用 weak_ptr 代替 shared_ptr。

2. 手动解除引用。

当对象之间出现循环引用时,我们可以手动解除其中一方的引用,避免形成循环引用。

例如,将类 A 对类 B 的引用改为指向 B 的成员变量。

3. 使用智能指针实现循环引用计数。

一些智能指针库提供了循环引用计数的功能,能够自动检测和解决循环引用问题。

四、总结本文介绍了智能指针的循环引用问题,分析了循环引用的原因和危害,并提出了三种解决方法。

在使用智能指针时,必须注意循环引用问题,避免内存泄漏和程序崩溃等问题的发生。

实例 赋值给 智能指针的方法

实例 赋值给 智能指针的方法

实例赋值给智能指针的方法
在C++中,智能指针是一种特殊的指针,它可以自动管理内存,防止内存泄漏。

智能指针主要有三种:`std::unique_ptr`、`std::shared_ptr`和
`std::weak_ptr`。

下面是一个使用`std::unique_ptr`的例子:
```cpp
include <memory>
class MyClass {
public:
MyClass(int value) : value_(value) {}
void printValue() { std::cout << value_ << std::endl; }
private:
int value_;
};
int main() {
// 创建一个std::unique_ptr实例并指向一个新创建的MyClass对象 std::unique_ptr<MyClass> ptr(new MyClass(10));
// 使用智能指针的解引用运算符()来访问对象的成员函数
ptr->printValue(); // 输出:10
// 当智能指针超出作用域时,它会自动删除它所拥有的对象
return 0;
}
```
在这个例子中,我们创建了一个`std::unique_ptr`实例`ptr`,并让它指向一个新创建的`MyClass`对象。

然后我们使用`ptr->printValue()`来调用
`MyClass`对象的成员函数。

最后,当`ptr`超出作用域时,它会自动删除它所拥有的`MyClass`对象,防止内存泄漏。

智能指针的实现原理

智能指针的实现原理

智能指针的实现原理智能指针是C++语言中的一个重要的概念,是一种用于自动管理内存的技术。

它的实现原理基于C++的RAII(Resource Acquisition Is Initialization)机制,即资源获取即初始化的理念。

智能指针可以帮助我们防止内存泄漏和空指针错误,提高程序的安全性和稳定性。

智能指针的实现主要包括两个关键点:引用计数和所有权转移。

引用计数指的是智能指针中存储了一个计数器,用来记录有多少个智能指针共享同一块堆内存。

每当有一个新的智能指针指向该内存时,计数器就会加一。

每当一个智能指针被销毁时,计数器就会减一。

当计数器变为零时,就说明没有任何智能指针指向该内存,此时就可以将该内存释放回操作系统。

所有权转移指的是智能指针可以通过移动构造函数和移动赋值运算符实现所有权的传递。

所有权是指在同一时间内,只有一个智能指针拥有对某个内存块的操作权限。

当一个智能指针转移所有权时,它将负责内存的释放和管理。

这种机制使得智能指针能够实现资源的高效管理,同时保证内存的安全使用。

当我们使用智能指针时,可以选择使用标准库中提供的shared_ptr和unique_ptr。

shared_ptr使用引用计数来管理内存,可以实现多个智能指针共享同一块内存,并且能够自动释放内存。

unique_ptr则只能拥有独占的所有权,不能共享内存,但由于不需要实时的引用计数处理,因此更加轻量级,也更加高效。

总之,智能指针的实现原理是基于C++的RAII机制和引用计数、所有权转移机制。

它可以有效地防止内存泄漏和空指针错误,提高程序的安全性和稳定性。

我们在编写代码时,应该养成使用智能指针的好习惯,从而使我们的程序更加高效、可靠。

详解C++中shared_ptr的使用教程

详解C++中shared_ptr的使用教程

详解C++中shared_ptr的使⽤教程shared_ptr是⼀种智能指针(smart pointer)。

shared_ptr的作⽤有如同指针,但会记录有多少个shared_ptrs共同指向⼀个对象。

这便是所谓的引⽤计数(reference counting)。

⼀旦最后⼀个这样的指针被销毁,也就是⼀旦某个对象的引⽤计数变为0,这个对象会被⾃动删除。

这在⾮环形数据结构中防⽌资源泄露很有帮助。

auto_ptr由于它的破坏性复制语义,⽆法满⾜标准容器对元素的要求,因⽽不能放在标准容器中;如果我们希望当容器析构时能⾃动把它容纳的指针元素所指的对象删除时,通常采⽤⼀些间接的⽅式来实现,显得⽐较繁琐。

boost库中提供了⼀种新型的智能指针shared_ptr,它解决了在多个指针间共享对象所有权的问题,同时也满⾜容器对元素的要求,因⽽可以安全地放⼊容器中。

总结下⼏个使⽤shared_ptr需要注意的问题:⼀. 相互引⽤链class C;class B : public std::enable_shared_from_this<B>{public:~B(){ cout << "~B" << endl; }void SetPC(std::shared_ptr<C>& pc){ _pc = pc; }private:std::shared_ptr<C> _pc;};class C : public std::enable_shared_from_this<C>{public:~C(){ cout << "~C" << endl; }void SetPB(std::shared_ptr<B>& pb){ _pb = pb; }private:std::shared_ptr<B> _pb;};int main(){std::shared_ptr<C> pc = std::make_shared<C>();std::shared_ptr<B> pb = std::make_shared<B>();pc->SetPB(pb);pb->SetPC(pc);return 0;}上⾯的代码中,B和C均不能正确析构,正确的做法是,在B和C的释放函数,如Close中,将其包含的shared_ptr置空。

智能指针引用计数原理

智能指针引用计数原理

智能指针引用计数原理
智能指针是C++11引入的一个新特性,它可以自动管理动态内存的释放,避免了内存泄漏的问题。

其中最重要的原理之一就是引用计数。

引用计数的原理是在智能指针中记录动态内存所拥有的引用数量。

每当一个新的智能指针指向该内存时,引用计数加1;当一个智能指针被销毁时,引用计数减1。

当引用计数减为0时,意味着动态内存已经没有引用,可以安全地释放。

这种引用计数的实现可以有效地避免内存泄漏的发生,同时也可以提高程序的性能。

但是,需要注意的是,引用计数不能解决循环引用的问题。

如果两个对象相互拥有智能指针,它们之间的引用计数会一直保持不为0,导致内存泄漏。

这时候需要使用其他的技术来解决循环引用的问题,比如弱指针或手动解除引用。

总之,智能指针的引用计数原理是一个非常重要的概念,对于理解智能指针的工作原理和优点具有重要意义。

在实际开发中,合理使用智能指针可以显著提高程序的健壮性和性能。

- 1 -。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【C++】智能指针类和OpenCV的Ptr模板类2015-03-29 21:18智能指针类引用计数智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count)。

智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象。

引用计数为0时,删除对象。

其基本使用规则是:每次创建类的新对象时,初始化指针并将引用计数置为1。

当对象作为另一对象的副本而创建时,复制构造函数复制指针并增加与之相应的引用计数的值。

对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数的值(如果引用计数减至0,则删除对象),并增加右操作数所指对象的引用计数的值。

最后,调用析构函数时,析构函数减少引用计数的值,如果计数减至0,则删除基础对象。

实现引用计数有两种经典策略:一是引入辅助类(包含引用计数型),二是使用句柄类(分离引用计数型)。

策略1:引用计数类这个类的所有成员均为private。

我们不希望用户使用U_Ptr 类,所以它没有任何public 成员。

将HasPtr 类设置为友元,使其成员可以访问U_Ptr 的成员。

U_Ptr 类保存指针和使用计数,每个HasPtr 对象将指向一个U_Ptr 对象,使用计数将跟踪指向每个U_Ptr 对象的HasPtr 对象的数目。

U_Ptr 定义的仅有函数是构造函数和析构函数,构造函数复制指针,而析构函数删除它。

构造函数还将使用计数置为1,表示一个HasPtr 对象指向这个U_Ptr 对象。

class U_Ptr{friend class HasPtr;int *ip;int use;U_Ptr(int *p):ip(p){}~U_Ptr(){delete ip;}};class HasPtr{public:HasPtr(int *p, int i):_ptr(new U_Ptr(p)),_val(i){}HasPtr(const HasPtr& obj):_ptr(obj._ptr),_val(obj._val){++_ptr->use;}HasPtr& operator=(const HasPtr&);~HasPtr(){if(--_ptr->use == 0)delete _ptr;}private:U_Ptr* _ptr;int _val;};接受一个指针和一个int 值的HasPtr 构造函数使用其指针形参创建一个新的U_Ptr 对象。

HasPtr 构造函数执行完毕后,HasPtr 对象指向一个新分配的U_Ptr 对象,该U_Ptr 对象存储给定指针。

新U_Ptr 中的使用计数为1,表示只有一个HasPtr 对象指向它。

复制构造函数从形参复制成员并增加使用计数的值。

复制构造函数执行完毕后,新创建对象与原有对象指向同一U_Ptr 对象,该U_Ptr 对象的使用计数加1。

析构函数将检查U_Ptr 基础对象的使用计数。

如果使用计数为0,则这是最后一个指向该U_Ptr 对象的HasPtr 对象,在这种情况下,HasPtr 析构函数删除其U_Ptr 指针。

删除该指针将引起对U_Ptr 析构函数的调用,U_Ptr 析构函数删除int 基础对象。

赋值与引用计数首先将右操作数中的使用计数加1,然后将左操作数对象的使用计数减1 并检查这个使用计数。

像析构函数中那样,如果这是指向U_Ptr 对象的最后一个对象,就删除该对象,这会依次撤销int 基础对象。

将左操作数中的当前值减1(可能撤销该对象)之后,再将指针从rhs 复制到这个对象。

赋值照常返回对这个对象的引用。

HasPtr& HasPtr::operator=(const HasPtr &rhs){++rhs.ptr->use; // increment use count on rhs firstif (--ptr->use == 0)delete ptr; // if use count goes to 0 on this object,delete itptr = rhs.ptr; // copy the U_Ptr objectval = rhs.val; // copy the int memberreturn *this;}这个赋值操作符在减少左操作数的使用计数之前使rhs 的使用计数加1,从而防止自身赋值。

如果左右操作数相同,赋值操作符的效果将是U_Ptr 基础对象的使用计数加1 之后立即减1。

值型类复制值型对象时,会得到一个不同的新副本。

对副本所做的改变不会反映在原有对象上,反之亦然。

string 类是值型类的一个例子。

要使指针成员表现得像一个值,复制HasPtr 对象时必须复制指针所指向的对象:复制构造函数不再复制指针,它将分配一个新的int 对象,并初始化该对象以保存与被复制对象相同的值。

每个对象都保存属于自己的int 值的不同副本。

因为每个对象保存自己的副本,所以析构函数将无条件删除指针。

赋值操作符不需要分配新对象,它只是必须记得给其指针所指向的对象赋新值,而不是给指针本身赋值。

//复制构造函数定义HasPtr(const HasPtr &orig):ptr(new int (*orig.ptr)), val(orig.val) { }//赋值函数定义HasPtr& HasPtr::operator=(const HasPtr &rhs){*ptr = *rhs.ptr; // copy the value pointed toval = rhs.val; // copy the intreturn *this;}策略2:句柄类C++ 中一个通用的技术是定义包装(cover)类或句柄类。

句柄类存储和管理基类指针。

指针所指对象的类型可以变化,它既可以指向基类类型对象又可以指向派生类型对象。

用户通过句柄类访问继承层次的操作。

因为句柄类使用指针执行操作,虚成员的行为将在运行时根据句柄实际绑定的对象的类型而变化。

因此,句柄的用户可以获得动态行为但无须操心指针的管理。

包装了继承层次的句柄有两个重要的设计考虑因素:* 像对任何保存指针的类一样,必须确定对复制控制做些什么。

包装了集成层次的句柄通常表现得像一个智能指针或者像一个值。

* 句柄类决定句柄接口屏蔽还是不屏蔽继承层次,如果不屏蔽继承层次,用户必须了解和使用基本层次中的对象。

智能指针就是模拟指针动作的类。

所有的智能指针都会重载-> 和* 操作符。

class Smart_Pointer{public://default constructor: unbound handleSmart_Pointer():_p(0),_use(new std::size_t(1)){}//attaches a handle to a copy of the Base objectSmart_Pointer(const Base&);//copy control members to manage the use count and pointersSmart_Pointer(const Smart_Pointer& i):_p(i._p),_use(i._use){++*use;}~Smart_Pointer(){ decr_use();}Smart_Pointer& operator=(const Smart_Pointer&);//member access operatorsconst Base *operator->() const{if(_p)return _p;elsethrow std::logic_error("unbound Base");}const Base &operator*() const{if(_p)return *p;elsethrow std::logic_error("unbound Base");}private:Base *_p;std::size_t *_use;void decr_use(){if(--*use == 0){delete _p;delete _use;}}};OpenCV的Ptr模板类OpenCV中的智能指针Ptr模板类就是采用分离引用计数型的句柄类实现技术。

以OpenCV的人脸识别为例,实现了人脸识别中的三种算法:Eigenface、FisherFace和基于LBP特征的算法。

这三种算法也分别封装成三个类:Eigenfaces、Fisherfaces、LBPH 类,这三个类均派生自FaceRecognizer类,而FaceRecognizer类则派生自Algorithm 类。

FaceRecognizer类是一个抽象基类。

OpenCV就是采用一个泛型句柄类Ptr管理FaceRecognizer类的对象。

template<typename _Tp> class CV_EXPORTS Ptr{public://! empty constructorPtr();//! take ownership of the pointer. The associated reference counter is allocated and set to 1Ptr(_Tp* _obj);//! calls release()~Ptr();//! copy constructor. Copies the members and calls addref()Ptr(const Ptr& ptr);template<typename _Tp2> Ptr(const Ptr<_Tp2>& ptr);//! copy operator. Calls ptr.addref() and release() before copying the membersPtr& operator = (const Ptr& ptr);//! increments the reference countervoid addref();//! decrements the reference counter. If it reaches 0, delete_obj() is calledvoid release();//! deletes the object. Override if neededvoid delete_obj();//! returns true iff obj==NULLbool empty() const;//! cast pointer to another typetemplate<typename _Tp2> Ptr<_Tp2> ptr();template<typename _Tp2> const Ptr<_Tp2> ptr() const;//! helper operators making "Ptr<T> ptr" use very similar to "T* ptr"._Tp* operator -> ();const _Tp* operator -> () const;operator _Tp* ();operator const _Tp*() const;_Tp* obj; //< the object pointer.int* refcount; //< the associated reference counter};当创建一个FaceRecognizer的派生类Eigenfaces 的对象时,我们把这个Eigenfaces对象放进Ptr 对象内,就可以依赖句柄类Ptr 确保Eigenfaces对象自动被释放。

相关文档
最新文档