目录
1、智能指针含义
2、智能指针的分类
1、智能指针含义
(1)C++智能指针是一种用于管理动态内存的指针,可以自动进行内存管理,避免了手动管理内存所带来的问题。
(2)智能指针的核心思想是资源分配即初始化(RAII),即在对象的构造函数中进行资源分配,在对象的析构函数中进行资源释放。智能指针通过重载指针操作符和析构函数来实现资源的自动释放,从而避免了内存泄漏和野指针的问题。
2、智能指针的分类
C++中的智能指针主要有以下几种:
(1)unique_ptr:独占式智能指针,只能有一个指针指向该对象,当指针被销毁时,对象也会被自动销毁。
使用方法:
std::unique_ptr<int> p(new int(42)); // 创建一个unique_ptr,指向int类型的动态内存,初始值为42
std::cout << *p << std::endl; // 输出42
*p = 100; // 修改动态内存中的值
std::cout << *p << std::endl; // 输出100
(2)shared_ptr:
shared_ptr是一种共享式智能指针,即多个shared_ptr可以共同拥有同一个内存资源。每个shared_ptr内部有一个计数器,记录有多少个shared_ptr指向同一个内存资源,当计数器为0时,内存资源被自动释放。
使用方法:
std::shared_ptr<int> p1(new int(42)); // 创建一个shared_ptr,指向int类型的动态内存,初始值为42
std::shared_ptr<int> p2 = p1; // p2和p1共享同一个内存资源
std::cout << *p1 << " " << *p2 << std::endl; // 输出42 42
*p1 = 100; // 修改动态内存中的值
std::cout << *p1 << " " << *p2 << std::endl; // 输出100 100
(3)weak_ptr:弱引用智能指针,它指向一个shared_ptr所管理的内存资源,但是不会增加内存资源的引用计数。当所指向的内存资源被释放时,weak_ptr会自动变成空指针。是shared_ptr的一种补充,可以解决shared_ptr的循环引用问题,但是不能直接访问对象,需要先将其转换为shared_ptr。
使用方法:
std::shared_ptr<int> p(new int(42)); // 创建一个shared_ptr,指向int类型的动态内存,初始值为42
std::weak_ptr<int> wp = p; // 创建一个weak_ptr,指向p所管理的内存资源
std::cout << *wp.lock() << std::endl; // 输出42,使用lock()函数获取weak_ptr指向的内存资源的shared_ptr
p.reset(); // 释放p所管理的内存资源
if(wp.expired()) // 判断wp是否为空指针std::cout << "wp is null" << std::endl; // 输出wp is null
总结:
智能指针是C++11中新增的重要特性,它可以有效地避免内存泄漏和空指针问题,提高代码的安全性、程序的健壮性和可维护性。在实际开发中,应该根据具体的场景选择不同类型的智能指针,合理地管理动态内存。
注意:智能指针并不能完全取代手动管理内存,对于一些特殊场景仍需要手动管理内存。