一文掌握C++智能指针全部用法
什么是智能指针
在C++中,当我们使用new操作符分配内存时,需要手动回收内存。如果忘记回收内存,就会出现内存泄漏等问题。为了解决这个问题,C++11引入了智能指针(Smart Pointer)。
智能指针是一种类,用来在动态分配的对象生命周期结束时自动释放该对象。它是指向动态分配的内存的类对象,这个类对象中承担了释放内存的责任。
智能指针的使用
C++的STL库中提供了两种类型的智能指针,分别是shared_ptr和unique_ptr。
shared_ptr
shared_ptr是共享的智能指针,它允许多个智能指针指向同一个对象。对于内存的释放,只有最后一个shared_ptr被销毁的时候才会释放。shared_ptr中使用引用计数方法,每增加一个智能指针,引用计数就+1,每销毁一个智能指针,引用计数就-1。当引用计数为0的时候,被共享的对象就会被销毁。
shared_ptr的定义方式为:
std::shared_ptr<int> p(new int);
通过make_shared函数创建shared_ptr的方式也很常见:
auto sp = std::make_shared<int>(42);
在赋值时,可以使用拷贝或移动语义,从一个shared_ptr移动指针:
auto sp1 = std::make_shared<int>(42);
auto sp2 = sp1; // increase ref count 1 -> 2
auto sp3 = std::move(sp1); // no change to ref count
unique_ptr
unique_ptr是唯一的智能指针,它不允许多个指针指向同一个对象。当unique_ptr被销毁时,它所指向的对象也会被销毁。
unique_ptr的定义方式为:
std::unique_ptr<int> up(new int);
和shared_ptr相同,通过make_unique函数创建unique_ptr的方式也很常见:
auto up = std::make_unique<int>(42);
使用拷贝语义时,unique_ptr会禁用拷贝构造函数和赋值操作符:
std::unique_ptr<int> up1(new int(42));
std::unique_ptr<int> up2 = up1; // compile error - copy constructor deleted
要进行移动语义的赋值,可以使用std::move:
std::unique_ptr<int> up1(new int(42));
std::unique_ptr<int> up2 = std::move(up1); // move semantics
示例说明
示例一:shared_ptr
#include <memory> // for smart pointers
#include <iostream>
int main()
{
auto sp1 = std::make_shared<int>(42);
auto sp2 = sp1;
std::cout << "sp1 ref count: " << sp1.use_count() << '\n';
std::cout << "sp2 ref count: " << sp2.use_count() << '\n';
return 0;
}
输出结果:
sp1 ref count: 2
sp2 ref count: 2
示例二:unique_ptr
#include <memory> // for smart pointers
#include <iostream>
int main()
{
auto up1 = std::make_unique<int>(42);
auto up2 = std::move(up1);
std::cout << "up1 pointer: " << up1.get() << '\n';
std::cout << "up2 pointer: " << up2.get() << '\n';
return 0;
}
输出结果:
up1 pointer: 0
up2 pointer: 0x564ddad87a00
总结
C++的智能指针为我们带来了很多方便,可以有效的避免常见的内存泄漏问题。shared_ptr和unique_ptr是目前最常用的智能指针,根据使用场景进行选择即可。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文掌握C++ 智能指针全部用法 - Python技术站