回答如下:
C++的智能指针是一种特殊类型的“指针”
,其主要目的是自动跟踪内存分配和释放
,以避免程序中出现内存泄露或空悬指针等问题,主要采用的技术是:借助于类的生命周期
,当超出了类的作用域时,类对象会自动调用析构函数,然后就可以释放内存等资源,无需手动回收。在C++中,有四种主要类型的智能指针:auto_ptr,unique_ptr,shared_ptr,weak_ptr。
auto ptr 实现了智能指针的基本功能
,持有资源的模式为独占型
。实现独占型资源的方式为赋值构造和赋值拷贝函数,在调用这些函数时,会进行资源所有权的转移。比如,当将一个auto ptr P1赋值给另一个auto ptr P2时,资源就从 P1 转移到了 P2,这也意味着此时 P1 中已经不存在资源,这会导致存在潜在的内存崩溃问题
。
unique ptr 是auto ptr 的升级版
,持有资源的模式为独占型
。因为C++11支持了移动构造和移动赋值函数
,实现独占资源的方式不再是拷贝构造和拷贝赋值函数,因此,当将一个auto ptr P1赋值给另一个auto ptr P2时,编译器会报错,解决了auto ptr 赋值后指向无效数据的问题,如果实在需要像auto ptr那样赋值,可以使用 std::move函数
,将P1转为右值处理,但这意味着要确保不再使用P1,否则将也会出现类似 auto ptr 内存崩溃的问题。
shared ptr 它是unique ptr 的升级版
,不在限于一个智能指针持有一个资源,实现为共享型资源
,多个智能指针可以指向相同的对象,实现方式为引用计数机制
,通过计数来表明资源被几个智能指针引用和共享,当计数为0时,说明资源已经不再被任何智能指针使用,从而可以进行释放资源的操作。
weak ptr 它是为了解决 shared ptr 存在的相互引用导致资源死锁的问题
:如果说两个shared_ptr相互引用,那么这两个指针的引用计数永远不可能下降为0,资源永远不会释放。weak ptr它不持有资源,只提供对资源的访问手段
,是对象的一种弱引用,所以不会引起引用计数的变化。
总之,智能指针是一种方便而强大的C++编程工具,可以帮助程序员避免内存泄漏和空悬指针等问题,并提高代码的可读性和可维护性。尽管这些指针在使用上有一些限制和注意事项,但它们仍然是一种非常有用的工具,值得我们深入了解和掌握。