如何通过示例代码在 C++ 中使用智能指针
【摘要】 在 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)