21xrx.com
2024-12-27 19:48:14 Friday
登录
文章检索 我的文章 写文章
C++11智能指针示例代码
2023-07-05 03:30:33 深夜i     --     --
C++11 智能指针 示例代码

智能指针是C++11中引入的新特性,它允许程序员更方便地管理内存资源,有效地避免内存泄漏等问题。本文将介绍C++11中智能指针的使用,并给出一些示例代码。

## 智能指针的概念

智能指针是一种封装了原始指针的类模板,它可以自动管理指针所指向的内存资源,包括内存的申请和释放等。智能指针使用引用计数的方式来跟踪其所指向的对象,当引用计数为0时,智能指针会自动释放内存资源。

C++11提供了三种智能指针:unique_ptr、shared_ptr和weak_ptr。其中unique_ptr是独占式智能指针,它只能拥有一个指向对象的指针;shared_ptr是共享式智能指针,它可以拥有多个指向对象的指针,当引用计数为0时自动释放内存资源;weak_ptr是一种类似共享式指针的智能指针,不过它不会增加引用计数。

## unique_ptr示例

unique_ptr是C++11中引入的独占式智能指针,它只能拥有一个指向对象的指针。


#include <iostream>

#include <memory>

int main() {

  // 创建一个unique_ptr指向一个int类型的对象

  std::unique_ptr<int> p(new int(10));

  std::cout << "p = " << *p << std::endl;

  // unique_ptr是独占式智能指针,不允许拷贝

  // std::unique_ptr<int> q = p;  // 编译错误

  // 释放unique_ptr的所有权

  p.reset();

  std::cout << "p = " << p.get() << std::endl;

  return 0;

}

上述代码创建了一个unique_ptr指向一个int类型的对象,然后输出该对象的值。由于unique_ptr是独占式智能指针,所以我们不能将其拷贝给另一个unique_ptr,只能使用move语义转移所有权。最后,我们使用reset方法释放了unique_ptr的所有权。

## shared_ptr示例

shared_ptr是C++11中引入的共享式智能指针,它可以拥有多个指向对象的指针,当引用计数为0时自动释放内存资源。


#include <iostream>

#include <memory>

int main() {

  // 创建一个shared_ptr指向一个int类型的对象,引用计数为1

  std::shared_ptr<int> p(new int(10));

  std::cout << "p = " << *p << ", use_count = " << p.use_count() << std::endl;

  // 创建一个shared_ptr指向同一个对象,引用计数为2

  std::shared_ptr<int> q(p);

  std::cout << "q = " << *q << ", use_count = " << q.use_count() << std::endl;

  // 释放q的所有权,引用计数为1

  q.reset();

  std::cout << "use_count = " << p.use_count() << std::endl;

  // 释放p的所有权,引用计数为0,自动释放内存资源

  p.reset();

  std::cout << "use_count = " << p.use_count() << std::endl;

  return 0;

}

上述代码创建了一个shared_ptr指向一个int类型的对象,然后创建了一个指向同一对象的shared_ptr,引用计数为2。使用reset方法可以释放shared_ptr的所有权,引用计数会相应减少,当引用计数为0时,shared_ptr会自动释放内存资源。

## weak_ptr示例

weak_ptr是C++11中引入的一种类似共享式指针的智能指针,不过它不会增加引用计数。通常情况下,weak_ptr是从shared_ptr创建出来的,它可以用来检测shared_ptr是否已经被释放。


#include <iostream>

#include <memory>

int main() {

  // 创建一个shared_ptr和一个weak_ptr指向同一个对象

  std::shared_ptr<int> p(new int(10));

  std::weak_ptr<int> q(p);

  // 检测shared_ptr是否还存在

  if(std::shared_ptr<int> r = q.lock()) {

    std::cout << "q is valid, *r = " << *r << std::endl;

  } else

    std::cout << "q is invalid" << std::endl;

  

  // 释放shared_ptr的所有权,引用计数为0

  p.reset();

  // 再次检测shared_ptr是否还存在

  if(std::shared_ptr<int> r = q.lock()) {

    std::cout << "q is valid, *r = " << *r << std::endl;

  } else

    std::cout << "q is invalid" << std::endl;

  

  return 0;

}

上述代码创建了一个shared_ptr和一个weak_ptr指向同一个对象,利用lock方法可以检测shared_ptr是否还存在,若存在则获取其值。

当释放shared_ptr的所有权后,再次检测shared_ptr是否还存在,发现此时已经不存在。

## 总结

以上就是C++11智能指针的使用方法以及相应的示例代码。智能指针是一种非常好的内存管理工具,可以有效地避免内存泄漏等问题。在实际开发中,我们可以根据具体的需求选择不同的智能指针来管理内存资源。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复