问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何理解智能指针?

发布网友 发布时间:2022-05-13 15:54

我来回答

5个回答

热心网友 时间:2023-10-15 05:31

简单的来讲,智能指针表面上看来是一种指针的类型,只不过能自主的完成一些产出之类的工作,所以被称为智能指针。


如你所看到的那样,借助 C++ RAII(Resource acquisition is initialization) 特性,在类型(class)的析构函数时来完成自动释放指针所指向对象的目的。

 什么是智能指针?

先看看一个最简单的例子 auto_ptr:

template <class T> class auto_ptr
{
   T* ptr;
public:
   explicit auto_ptr(T* p = 0) : ptr(p) {}
   ~auto_ptr()                 {delete ptr;}
   T& operator*()              {return *ptr;}
   T* operator->()             {return ptr;}
   // ...
};

首先它拥有指针最基本的 2 个特性:deferencing(operator *) 和 indirection(operator ->). 于是下面的代码

void foo()
{
   MyClass* p(new MyClass);
   p->DoSomething();
   delete p;
}

这样我们新申请的 MyClass 可以完全由智能指针 p 接管,p 知道何时去释放这块内存,而不需要程序员去操心。

 为什么要用智能指针?

使用智能指针的好处是显而易见的,正如上面所举例,可以有效的防止因为程序员粗心而引发的内存泄露问题。当然,智能指针所能达到的效果还远不止于此,它可以使你的程序更加安全、高效。

可以想象,当程序逻辑越来越复杂的时候,传统的代码将会变得更加臃肿不堪。从美观的角度来说,这样的代码或许缺少点艺术性在里面,那么还是用智能指针吧,代码依然如此简洁、优雅。

当出现访问异常的时候,可能要耗费程序员很多精力去排查这类问题,因为 delete p 之后 p 可能依然指向某块内存(悬挂的)但是却是无效的指针。


所以其实智能指针就是让编程更加的方便。

热心网友 时间:2023-10-15 05:31

在当今科技里面,智能指针是手表的重要部分,那么如何理解智能指针?


智能指针是存储指向动态分配(堆)对象指针的类,把一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象。

每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,析构函数减少引用计数(如果引用计数减至0,则删除基础对象)。

实现引用计数有两种经典策略:一是引入辅助类,二是使用句柄类。

智能指针是存储指向动态分配(堆)对象指针的类。除了能够在适当的时间自动删除指向的对象外,他们的工作机制很像C++的内置指针。智能指针在面对异常的时候格外有用,因为他们能够确保正确的销毁动态分配的对象。他们也可以用于跟踪被多用户共享的动态分配对象。

事实上,智能指针能够做的还有很多事情,例如处理线程安全,提供写时复制,确保协议,并且提供远程交互服务。有能够为这些ESP (Extremely Smart Pointers)创建一般智能指针的方法,但是并没有涵盖进来。

智能指针的大部分使用是用于生存期控制,阶段控制。它们使用operator->和operator*来生成原始指针,这样智能指针看上去就像一个普通指针。

这样的一个类来自标准库:std::auto_ptr。它是为解决资源所有权问题设计的,但是缺少对引用数和数组的支持。并且,std::auto_ptr在被复制的时候会传输所有权。在大多数情况下,你需要更多的和/或者是不同的功能。这时就需要加入smart_ptr类。

如此看来,智能指针还是很好理解的。

热心网友 时间:2023-10-15 05:32

很多人有可能还不太了解什么是只能指针,我就先给大家科普一下只能指针究竟是一个什么东西!智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象。智能指针的目的是GC,使得内存泄漏得到杜绝,而智能指针就是利用C++的RAII机制实现的!

智能指针的作用

第一,智能指针最基本的概念是引用计数,也就是智能指针内部有一个计数器记录了当前内存资源到底有多少指针在引用(可以访问这个资源),当新增加一个可以访问这个资源的引用时,计数器会加1,反之会减去1,当计数器为0时,智能指针会自动释放他所管理的资源。手动申请,自动释放,就是其智能的体现。

第二,我们写代码的时候总是会有异常情况发生,比如在一段进行了try/catch的代码段里面,即使你写入了delete,也有可能因为发生异常,程序进入catch块,从而忘记释放内存,这些都可我们以通过智能指针解决。这样就能解决异常问题

第三,但是智能指针还有一重更加深刻的含义,就是把 value语义转化为reference语义。

例如:

Java中往容器中放对象,实际放入的是引用,不是真正的对象,而C++在vector中push_back采用的是值拷贝,如果想实现Java中的引用语义,就应该使用智能指针

综上所述,我想大家对智能指针也有了清晰的认识和了解了!希望大家我的回答能够帮到题主。

热心网友 时间:2023-10-15 05:32

我认为智能指针相对于普通纸张来说非常方便,非常便捷,而且她还很智能化对于人的使用非常的方便。所以称之为智能指针

热心网友 时间:2023-10-15 05:33

智能指针的话我觉得比我们普通的指针的话,要先进很多。可以让我们的话很好的运用,让我们的生活充满了很多的智能化,很先进的是
C++|深入理解智能指针

智能指针是一个类类型,它乔装打扮成一个指针,但额外提供了内建指针所无法提供的能力。通常而言,一个智能指针通过使用类的构造函数、析构函数和复制操作符所提供的能力,来控制(或跟踪)对它所指向的东西的访问,而内建指针在这方面则无能为力。所有智能指针都重载 -&gt; 和* 操作符,从而可以采用标...

C++中的指针型句柄和智能指针的比较

句柄类可以理解为对象的索引,智能指针的存在可以理解为避免多指针共享一对象时候某个指针呗delete后对象呗销毁,造成别的指针无法访问

Rust学习笔记Day17 智能指针之Box&lt;T&gt;

在Rust的学习过程中,智能指针是数据结构中的一大挑战。其中,Box作为最基本且广泛使用的堆内存分配方式,实际上是一种智能指针。它不仅指向数据,还提供了额外的内存管理和资源回收功能,通过实现Deref、DerefMut和Drop等trait来确保内存的正确释放。智能指针与普通指针的区别在于所有权和内存管理。例如,Strin...

C++中 什么是普通指针,内置指针

我认为,“内置指针”和“内置类型”没有什么联系,译者之所以称之为“内置指针”,是为了将其与“智能指针”区分开。我的理由是,上图中,指针p 指向 Foo 对象,Foo 并非内置类型,但译者却称其为“内置指针”。C++中真正意义上的指针只有一个,就是所谓的“内置指针”。试想一下,在32位的环境中...

Rust 智能指针教程

1. Rust智能指针基础Rust中的智能指针设计旨在增强内存管理的效率和安全性,它们自动处理内存的生命周期,防止空悬引用和数据竞争等问题。2. Box指针的运用Box指针是Rust中的一种特殊指针,它将所有权从原始数据结构转移,使得数据可以在堆上分配。使用Box的主要原因是它提供了动态大小对象的创建和传递。Box...

句柄是什么

首先,句柄可以被理解为一种特殊的智能指针,它是应用程序与操作系统或外部资源交互的桥梁。当程序需要访问数据库、操作系统管理的内存块或对象时,句柄就像一个引用,确保了对这些资源的正确管理和访问。其次,句柄在Windows编程中尤为基础,它是一个独特的整数值标识符,通常为4字节,用来区分和标识应用...

C++基础:auto_ptr的特性与源码浅析

在C++的早期版本中,auto_ptr是一种智能指针,但在C++11之后被标记为废弃。理解其废弃原因前,我们首先来探讨auto_ptr的特性及其源码解析。C++中的auto_ptr具有独特的特性,体现在其核心代码(Visual Studio 12.0/VC/include/xmemory中的实现)中。关键在于其拷贝构造函数和赋值操作符的参数类型,它们都...

如何理解shared_ptr和unique_ptr能否互转

C++中的智能指针最常用的是shared_ptr和unique_ptr,C++新手最常问的问题是我从一个函数中拿到unique_ptr,但要转成shared_ptr才能使用,要怎么转换?同理是否能将shared_ptr转换成unique_ptr?我们先简单看看shared_ptr是什么。std::shared_ptr&lt;Widget&gt; a = std::make_shared&lt;Widget&gt;();这句代码会...

CVTE C++一面面经(校招)

强制类型转换的安全性:编译器如何通过检查类型大小、位数等来保证转换的正确性和避免错误。智能指针:介绍shared_ptr的线程安全性和weak_ptr在循环引用中的作用。Lambda表达式底层解析:与普通函数的差异,包括匿名函数、捕获列表和函数体的处理。多态与虚函数:解释多态概念和C++中通过虚函数实现的多态机制。...

适合初学者的c++视频教程有哪些?

王桂林《这可能是你见过“最牛逼”的C++课程》(高清视频)百度网盘 链接: https://pan.baidu.com/s/13EipzVPw-wi1SB60OwzqEw 提取码: rwyi 复制这段内容后打开百度网盘手机App,操作更方便哦 若资源有问题欢迎追问~

万能指针能表示智能指针吗 指向智能指针的指针 智能指针和普通指针 普通指针转智能指针 智能指针如何实现自动释放 如何简单的理解指针 如何通俗理解指针 智能指针什么时候不能用 智能指针原理
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
把亲爱的翻译成英文怎么拼? 卖黄金都学什么 卖黄金需要什么经验 卖黄金要什么资质 烤鸭烤箱多少温度和时间 为什么我手机无线网络连不上了? 壁挂炉不灭火是怎么回事 为什么壁挂炉加温后灭火像爆炸 是什么原因导致壁挂炉一段时间后就熄灭了?- 原的拼音原的意思 智能指针的介绍 c++中关于智能指针std::tr1::shared_ptr的用法 C++智能指针的几种用法 c++中普通指针和智能指针之间可以互相转换吗 C++ 类中 智能指针 的使用。这个是看的C++primer,在赋值操作符重载函数体里面有一句没看懂…… 关于C++ 中的智能指针的问题。 c++中的智能指针是什么 智能指针的智能指针 C++ 智能指针在什么时候使用 如何理解智能指针 c++ 中什么样的指针是裸指针,参数可以是智能指针的引用吗,求高手举例指教 c++之我们为什么选择使用智能指针 智能指针能作为参数传递吗 指针能作为引用参数吗? 刚刚接到电话说我的要被封了,让我解除所有与微信相关的绑定,是真的吗? 000963华东医药股票股吧 沈阳金属研究所金属材料专业研究生待遇 张建新的个人简介 帮帮忙推荐一些国内外的著名的铸造公司或研究机构!!! 中科院金属材料研究所(沈阳)考研 智能指针原理 stl:map使用智能指针做键可以吗 不用c++11怎么实现智能指针 c++智能指针有哪些 大泥王怎么调上下午 不干胶打印机老是打偏怎么回事? 卡西欧大泥王按键寿命 蒲公英根哪里有卖 蒲公英药店里有卖吗? 国内有没有机蒲公英根茶?经过有机认证的那种 同仁堂、修正、均林三家的蒲公英根茶有啥不同? 均林的蒲公英根茶会不会上火,我有朋友在淘宝上买的蒲公英根茶喝的就上火,嗓子不舒服? 好多图片显示加载失败.怎么办? 加载图片失败是怎么回事 图库图片显示加载失败 div+css居中的问题,宽屏控制居中偏了 图片加载失败咋回事? 得物图片加载失败 百度图片加载失败 百香果叶子可以做透明叶子吗?