shared_ptr是C++11中引入的一种智能指针,它可以用于管理动态分配的内存,并能够自动释放它所管理的资源。相较于unique_ptr,shared_ptr的所有权是共享的,多个shared_ptr可以指向同一块内存,当最后一个shared_ptr超出作用域或被删除时,它所管理的内存会被自动释放。
shared_ptr的声明方式如下:
std::shared_ptr<DataType> ptr(new DataType);
其中,DataType是指向所分配内存的数据类型,new DataType用于分配内存并返回一个指向所分配内存的指针,这个指针被传递给shared_ptr构造函数进行初始化。
shared_ptr的主要用法如下:
目录
1、管理动态分配的内存
shared_ptr可以管理动态分配的内存,当最后一个shared_ptr超出作用域或被删除时,它所管理的内存会被自动释放。以下是一个示例:
std::shared_ptr<int> ptr(new int(42));
2、避免内存泄漏
由于shared_ptr的自动释放特性,它可以避免因忘记释放内存而导致的内存泄漏。以下是一个示例:
void function()
{
std::shared_ptr<int> ptr(new int(42));
// do something
return; // ptr会自动释放内存
}
当函数结束时,最后一个shared_ptr对象会自动被销毁,并释放它所管理的内存。
3、共享所有权
shared_ptr的所有权是共享的,因此多个shared_ptr可以指向同一块内存。这在多个对象需要共享同一块内存时非常方便。
同时,share_ptr类型的指针支持赋值构造,以下是一个示例:
std::shared_ptr<int> ptr1(new int(42));
std::shared_ptr<int> ptr2 = ptr1;
实现原理如下图所示:
在share_ptr指针当中包含了两块数据,一个是数据元素指针,一个是引用计数对象控制块。可以看到share_ptr<int>ptr1(new int)的数据元素指针指向了一块新的内存空间,而控制块指针会指向一个堆当中的一个控制块的数据,刚开始创建时候引用计数为1。当ptr1指针赋值给同样类型的ptr2指针时,ptr1和ptr2都指向同一块内存,并共享它的所有权;ptr2指针中的控制块指针同样也指向堆当中的控制块数据,并且引用计数会加1。指针ptr1或者ptr2销毁时,引用计数会减1。当最后一个shared_ptr对象生命周期结束时,它所管理的内存会被自动释放。
4、使用自定义删除器
shared_ptr也支持自定义删除器,可以在释放内存时执行自定义的清理操作。以下是一个示例:
void my_deleter(int* ptr)
{
// do some clean-up
delete ptr;
}
std::shared_ptr<int> ptr(new int(42), &my_deleter);
在这个例子中,我们定义了一个名为my_deleter的函数,它将在shared_ptr释放内存时被调用。在shared_ptr的构造函数中,我们将my_deleter指针传递给shared_ptr,以便在释放内存时执行清理操作。
总之,shared_ptr通过自动管理内存和共享所有权等特性,可以帮助程序员更轻松地管理动态分配的内存,通过支持自定义删除器,也可以实现更灵活的内存管理。