c++中的智能指针是什么

说得简单深刻点,不要复制人家的,谢谢大家!!!!!!!!!!!!!

居然有人说是“通常指void*类型的指针”。。。。晕倒。。。。
引入智能指针可以防止出现悬垂指针的情况
一般是把指针封装到一个称之为智能指针类中,这个类中另外还封装了一个使用计数器,对指针的复制等操作将导致该计数器的值加1,对指针的delete操作则会减1,值为0时,指针为NULL
温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-02-18
栈上开辟的能自动释放, 会自动调用 构造函数和析构函数、
堆上开辟的不能自动释放,需要手动delete。
例如
有个类 class Perosn的类,类里面有个成员m_Age,通过有参构造初始化。
堆上开辟 Person*p=new Perosn(10) 那么,这就在堆上开辟了,m_Age是10;
这样的话,到最后,一定要手动 delete p; 需要手动释放。
为了避免忘记释放,就要搞一个智能指针,代替 Person的指针p

再建立一个类比如 class smartPointer ,
把Person 中的指针p, 通过有参构造的方法传到 smartpointer里面
class smartPointer(Person*p)
{
this->p =p;
}
然后内部自己维护一个 成员变量名字叫
Perosn*p ,
然后再弄一个析构函数,
里面判断, if(p!=NULL)
{
delete p;
P->NULL;
}

这样就初步完成了智能指针, 仅仅解决了释放的问题。
通过栈的自动释放,把堆的里面顺便给释放了, 也就不需要手动释放了。
比如

smartPointer sp(new Person*p)
栈上开辟了一个sp, 传进来一个有参 ,(参数是堆上开辟的指针)
为了使 sp 能够像p 一个 ,调用Person类里面的 m_Age;
比如
p->m_Age ; (*p).m_Age; 正常可用
sp->m_Age ; (*sp).mAge; 报错,不过希望达到这样的效果
那么久需要在smartpointer的类里面重载符号->和*
具体代码
Person* operator->()
{
return this->p;
}

Person & operator*()
{
retrun * this->p
}
这样,指针 sp 就能像p 一样使用了, 也不必考虑释放的问题。很方便。
第2个回答  2019-05-05
当有几个对象共同用一个资源时,则它们同时指向了这个资源,如果用普通的指针,则在其中一个对象析构时就会将这个共用的资源销毁,有了智能指针就不用担心,它里面有对象计数,代表有几个对象在用它,销毁一个就减1,直到为0,为0时就表示没有对象用这个资源了,就会自动释放资源存储区!还有很多智能的地方,你自己去网上看
第3个回答  2009-08-23
智能指针是说生成类的复本时
两个指针指向同一个实例,就是共享数据,是为了节省空间
直到其中一个数据发生变化才分开成为两个实例
第4个回答  2009-08-23
c++程序员一个头疼的问题就是用指针开空间与销毁空间。
试着执行下面一段代码:
/*******************************/
class A
{
public:
int *q;
A(int *p){q=p;}
~A(){delete q;}
};
class B
{
public:
int *q;
B(int *p){q=p;}
~B(){delete q;}
};

#include<iostream>
#include<string>
using namespace std;
int main()
{
int n=3;
A a(&n);
B b(&n);
return 0;
}
/*******************************/
如何,出错了吧?
这就是因为A对象析构时已经销毁了n的内存空间,然后B的指针就成了空的,B再析构就出错了。
智能指针的出现主要是为了解决类似问题,具体解决方法如楼上所说,引入计数器,确保最多一个析构时删除指针空间。
相似回答