发布网友 发布时间: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
智能指针的话我觉得比我们普通的指针的话,要先进很多。可以让我们的话很好的运用,让我们的生活充满了很多的智能化,很先进的是