shared_ptr函数简介
std::shared_ptr是C++标准库中的一个智能指针类型,它用于自动管理动态分配对象的生命周期,以防止内存泄漏。
基本概念:shared_ptr是一种智能指针,它跟踪指向的对象的引用计数。每当一个新的shared_ptr指向同一个对象时,引用计数增加;每当一个shared_ptr被销毁或重置时,引用计数减少。当引用计数减少到0时,shared_ptr会自动删除对象并释放内存。
初始化:可以使用std::make_shared函数或shared_ptr的构造函数来初始化一个shared_ptr。
例如:
std::shared_ptr<int> ptr1 = std::make_shared<int>(42);
std::shared_ptr<MyClass> ptr2(new MyClass());
引用计数:shared_ptr通过内部使用一个控制块来维护引用计数。这个控制块存储了引用计数、删除器和指向对象的指针。
每当一个新的shared_ptr与另一个shared_ptr共享对象时,引用计数会增加。
拷贝和赋值:当一个shared_ptr被拷贝或赋值给另一个shared_ptr时,它们将共享同一个对象,并且引用计数会增加。例如:
std::shared_ptr<MyClass> ptr3 = ptr2; // 引用计数增加
线程安全:std::shared_ptr的引用计数操作是线程安全的,这意味着多个线程可以同时操作同一个shared_ptr对象而不会导致数据竞争。
但是,对shared_ptr所指向的对象的访问仍然需要适当的同步机制。
性能考虑:由于shared_ptr维护了引用计数和控制块,因此它比原生指针和一些其他智能指针类型(如std::unique_ptr)有一些额外的开销。这在某些性能关键的应用场景中可能是个问题,需要权衡使用。
注意事项:不要将裸指针与shared_ptr混合使用,因为这可能导致悬挂指针或重复删除同一个对象。此外,避免在构造函数和析构函数中直接使用裸指针操作,因为这可能绕过shared_ptr的生命周期管理。
总的来说,std::shared_ptr是一种非常有用的工具,可以帮助开发人员自动管理动态分配的内存并防止内存泄漏。但是,像所有工具一样,它也有其局限性和适用场景,需要根据具体情况谨慎使用。
make_shared 简介
std::make_shared是C++标准库中的一个函数,用于创建一个std::shared_ptr智能指针,并分配对象。
这个函数是C++11引入的,用于改进shared_ptr的初始化过程,并提供一种更为高效的方式来创建智能指针。
函数的基本形式如下:
template< class T, class... Args >
shared_ptr<T> make_shared( Args&&... args );
其中,T是要创建的对象的类型,args是传递给T构造函数的参数列表。
使用std::make_shared的好处包括:
单一分配:make_shared在堆上同时分配对象和控制块,这只需要一次内存分配操作。
相比之下,使用shared_ptr的构造函数和new操作符则需要两次分配操作(一次用于对象,一次用于控制块)。因此,make_shared通常更高效。
类型安全:使用make_shared可以避免原始指针和智能指针之间的转换,从而提高类型安全。
异常安全:由于make_shared是单一分配,如果对象的构造函数抛出异常,那么不会泄漏内存。
使用示例:
#include <memory> // for std::shared_ptr, std::make_shared
struct MyClass {
int value;
MyClass(int v) : value(v) {}
};
int main() {
auto ptr = std::make_shared<MyClass>(42); // 创建一个 shared_ptr,指向一个值为42的 MyClass 对象
return 0;
}
在这个例子中,std::make_shared(42)创建了一个类型为MyClass的对象,
并使用值42初始化它。这个函数调用返回一个指向新创建的对象的std::shared_ptr智能指针。当这个智能指针离开其作用域或被重置时,它所指向的对象会被自动删除。
个人水平有限,有问题随时联系~