如何通过示例代码在 C++ 中使用智能指针

举报
Tiamo_T 发表于 2021/09/28 16:20:17 2021/09/28
2.8k+ 0 0
【摘要】 在 C 和 C++ 编程中,指针非常强大。正如我们在C 指针示例文章中所解释的,指针是保存另一个变量地址的变量,以便我们可以对该变量进行各种操作。有时程序员无法想象不使用指针编写代码,无论是简单的二叉搜索树程序,还是复杂的企业应用程序。但是,指针很难管理和掌握,如果处理不当,它们会导致许多问题。例如,如果使用不当,可能会导致核心转储、悬空指针、空指针异常、内存泄漏等。考虑以下代码片段。当我们...

在 C 和 C++ 编程中,指针非常强大。

正如我们在C 指针示例文章中所解释的,指针是保存另一个变量地址的变量,以便我们可以对该变量进行各种操作。

有时程序员无法想象不使用指针编写代码,无论是简单的二叉搜索树程序,还是复杂的企业应用程序。

但是,指针很难管理和掌握,如果处理不当,它们会导致许多问题。

例如,如果使用不当,可能会导致核心转储、悬空指针、空指针异常、内存泄漏等。

考虑以下代码片段。当我们在 Study() 方法中遇到异常时会发生什么?

Geek* geek=new Geek();
Geek->Study();
delete geek;  
// If study method raises an exception, who would do the above memory clean-up?

上述问题的解决方案是智能指针。

智能指针会自动处理许多这些问题。它们基本上是一个行为类似于指针的对象,即包装一个裸指针但提供额外的功能。所以我们应该使用这些来代替裸指针。


现在,让我们了解智能指针如何工作的基础知识。请注意,这只是用于创建智能指针的各种方法之一。

基本思想是为裸指针创建一个包装器,并重载一些将使用的运算符, * , -> 自动清理部分将由类的析构函数处理。

#include<iostream>
class Ptr
{
  int *ptr;
  public:
    explicit  Ptr(int *p = NULL) { ptr = p; }

  ~Ptr() { delete(ptr); }
  int &operator *() {  return *ptr; }

};
int main()
{
  Ptr ptr(new int());
  *ptr = 4;
  cout << *ptr;
  return 0;
}

在这段代码中,我们不需要在使用动态分配的变量后释放内存。

这显示了实现背后的基本思想。您可以使用模板库轻松地使其通用。

另一个想法是基于共享指针中使用的引用计数,它用于共享对象的所有权。

每有一个新的指针指向这个对象,引用对象就加一,当指针释放对象的所有权时,当最后一个指向它的指针释放所有权时,对象自动销毁。

代码示例:

#include<iostream>
class Ptr
{
  int *ptr;
  int count;
  public:
    explicit  Ptr(int *p = NULL)
    { ptr = p; 
      Count++;
    }

  ~Ptr() {
    count--;
    If(count==0) 
      delete(ptr); 
  }

  int &operator *() {  return *ptr; }

};

int main()
{
  Ptr ptr(new int());
  *ptr = 4;
  cout << *ptr;
  return 0;
}

上面的代码展示了如何使用引用计数来实现智能指针的基本思想。

您可以修改上面的代码使其通用并编写您自己的智能指针并使用它。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。