智能指针

Posted chengeputongren

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了智能指针相关的知识,希望对你有一定的参考价值。

  • 内存泄露(臭名昭著的BUG)
  1. 动态申请堆空间,用完后不归还
  2. C++语言中没有垃圾回收机制
  3. 指针无法控制所指堆空间的生命周期
  • 我们需要什么?
  1. 需要一个特殊的指针
  2. 指针生命周期结束时主动释放堆空间
  3. 一片堆空间最多只能由一个指针标识
  4. 杜绝指针运算和指针比较(可以避免野指针)
  • 解决方法
  1. 指针操作符(->和*)
  2. 只能通过类的成员函数重载
  3. 重载函数不能使用参数
  4. 只能定义一个重载函数
  • 小结:
  1. 指针操作符(->和*)可以被重载
  2. 重载操作符能够使用对象代替指针
  3. 智能指针只能用于指向堆空间的内存
  4. 智能指针的意义在于最大程度的避免内存问题
智能指针使用军规:只能用来指向堆空间中的对象或者变量
#include <iostream>
#include <string>
using namespace std;
class Test
{
    int i;
public:
    Test(int _val)
    {
        this->i = _val;
        cout << "Test(int _val)" << endl;
    }
    ~Test()
    {
        cout << "~Test()" << endl;
    }
    int get_value()
    {
        return i;
    }
};
class Pointer
{
    Test* mp;
public:
    Pointer(Test *p = NULL)
    {
        mp = p;
    }
    //执行深拷贝
    Pointer(const Pointer&obj)
    {
        mp = obj.mp;
        //剥夺初始化对象的只读属性
        const_cast<Pointer&>(obj).mp = NULL;
    }
    //重载赋值操作符
    Pointer& operator = (const Pointer& obj)
    {
        if (this!= &obj)
        {
            delete mp;
            mp = obj.mp;
            const_cast<Pointer&>(obj).mp = NULL;
        }
        return *this;
    }
    Test* operator ->()
    {
        return mp;
    }
    Test& operator *()
    {
        return *mp;
    }
    ~Pointer()
    {
        delete mp;
    }
    //如果mp等于NULL,返回true:1
    bool isNULL()
    {
        return (mp==NULL);
    }
};
int main()
{
    cout << "Hello World!
" <<endl;
    //使用类对象来代替指针,在变量p(对象)生命周期结束时
    //执行析构函数,释放变量mp
    Pointer p = new Test(6);
    cout << p->get_value() << endl;
    Pointer p1 = p;
    cout << p.isNULL() << endl;
    cout << p1->get_value() << endl;
}
运行结果:
Hello World!
Test(int _val)
6
1
6
~Test()

 

 
 

以上是关于智能指针的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 vscode 的代码片段,以便在自动完成后自动触发 vscode 的智能感知?

更新:C++ 指针片段

片段中的 EditText 上的空指针异常 [重复]

智能指针和异常

Android系统的智能指针(轻量级指针强指针和弱指针)的实现原理分析

查找由智能指针引起的内存泄漏