智能指针shared_ptr简介及小例子

文章介绍了C++中的shared_ptr,一种智能指针,通过引用计数管理动态分配对象的生命周期,包括线程安全特性及其在多线程环境中的使用。通过实例展示了shared_ptr的创建、共享和对象自动删除的过程。
摘要由CSDN通过智能技术生成

shared_ptr是一种智能指针,用于处理动态分配的对象。它提供了一种引用计数的机制,当没有任何其他shared_ptr指向一个对象时,该对象将被自动删除。

shared_ptr的作用类似于常规指针,但有一些额外的功能。它能够记录有多少个shared_ptr共享同一个对象,这是通过引用计数实现的。当创建一个新的shared_ptr指向一个对象时,引用计数会增加;当一个shared_ptr被销毁或重置时,引用计数会减少;当引用计数为0时,该对象的内存将被自动释放。

shared_ptr是线程安全的,多个线程可以共享同一个shared_ptr对象,而不会导致数据竞争或不一致的状态。然而,如果多个shared_ptr指向同一个对象,并且这些shared_ptr在多个线程中被修改或销毁,则需要进行适当的同步以确保数据的一致性和正确性。

下面是一个简单的示例,展示了如何使用shared_ptr:
 

#include <iostream>  
#include <memory>  
  
class MyClass {  
public:  
    MyClass(int value) : value_(value) {std::cout<<"MyClass 构造函数"<<std::endl;}  
    void printValue() { std::cout << "show "<<value_ << std::endl; }  
private:  
    int value_;  
};  
  
int main() {  
    std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>(42); 
	std::cout << "1111111111"<< std::endl; 
    std::shared_ptr<MyClass> ptr2 = ptr1;  
  
    ptr1->printValue();  // Output: 42  
    ptr2->printValue();  // Output: 42  
  
    ptr2.reset();  
  
   // ptr2->printValue(); 
    ptr1->printValue();  // Output: 42  
  
    ptr1.reset();  
  
    // At this point, the object pointed to by ptr1 and ptr2 is deleted.  
  
    return 0;  
}

MyClass 构造函数
1111111111
show 42
show 42
show 42

在上面的示例中,我们创建了两个shared_ptr,它们指向同一个MyClass对象。当我们使用printValue()方法时,可以看到输出是42。然后,我们销毁了ptr2,但因为还有ptr1指向该对象,所以该对象不会被删除。最后,我们销毁了ptr1,此时引用计数变为0,该对象被自动删除。
 

智能指针`shared_ptr`是C++标准库中的一部分,它提供了一个引用计数机制来跟踪和管理动态分配的资源。当`shared_ptr`对象被创建时,它会关联一个指向动态分配的对象的指针,并且维护一个引用计数,记录有多少个`shared_ptr`实例指向同一个对象。当`shared_ptr`实例被销毁或者其所有权被转移时,引用计数会相应减少。当引用计数降至零时,指向的对象会被自动删除,释放资源。 下面是一个简单的例子来展示如何使用`shared_ptr`: ```cpp #include <iostream> #include <memory> int main() { // 创建一个指向int的shared_ptr对象 std::shared_ptr<int> ptr1 = std::make_shared<int>(10); // 使用另一个shared_ptr对象引用同一资源 std::shared_ptr<int> ptr2 = ptr1; // 输出当前引用计数,应该为2 std::cout << "ptr1的引用计数: " << ptr1.use_count() << std::endl; std::cout << "ptr2的引用计数: " << ptr2.use_count() << std::endl; // 通过ptr1修改值 *ptr1 = 20; // 打印通过ptr2观察到的值,应该输出20 std::cout << "*ptr2的值: " << *ptr2 << std::endl; // ptr1被销毁,引用计数减1 ptr1.reset(); // 输出当前引用计数,现在应该只有1 std::cout << "ptr2的引用计数: " << ptr2.use_count() << std::endl; // 当ptr2也被销毁时,引用计数再次减1,降至0,动态分配的int对象被删除 return 0; } ``` 在这个例子中,我们首先使用`std::make_shared`创建了一个动态分配的`int`对象,并将其与`ptr1`关联。然后我们创建了另一个`shared_ptr`对象`ptr2`,使其指向相同的资源,这时引用计数为2。通过`ptr1`修改了关联资源的值,这个修改也能通过`ptr2`观察到,因为它们都指向同一个资源。当`ptr1`被销毁时,引用计数减1,最后当`ptr2`也被销毁时,引用计数减至0,动态分配的资源被自动删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值