内容纲要

指针的声明

智能指针的智能二字,主要体现在用户可以不关注资源的释放,
因为智能指针会帮你完全管理资源的释放,任何情况下资源到期都会释放

//裸指针
NormalClass *n = new NormalClass(TEXT(_FUNCTION_));

//共享指针
TSharedPtr<NormalClass,ESPMode::ThreadSafe> NormalSharedPtr(new NormalClass(TEXT(_FUNCTION_)));
//ESPMode::ThreadSafe 参数为声明一个线程安全的共享指针,不涉及线程安全问题可以去掉

//弱指针
TWeakPtr<NormalClass> NormalWeakPtr(NormalSharedPtr);
//弱指针不会改变引用计数,还可以转变为共享指针
//弱指针可以中断引用循环,举个例子
//类A中有类B的共享指针,类B中有类A的共享指针,比如在析构的时候会互相析构无线套娃,
//这时就可以在A中用B的共享指针,B中使用A的弱指针,这样B既可以观察A,又不会影响A

//唯一指针
TUniquePtr<NormalClass> NormalUniquePtr(new NormalClass(TEXT(_FUNCTION_)));
//构建了一个唯一指针 NormalUniquePtr ,这时想再用 new NormalClass(TEXT(_FUNCTION_)) 实例化出来的指针(NormalUniquePtr)构建一个 NormalUniquePtr2
//需要先释放,再用释放出来的指针构建 NormalUniquePtr2 ,就可以实现移交控制权
TUniquePtr<NormalClass> NormalUniquePtr2(NormalUniquePtr.Release());

裸指针的缺陷及实例演示

忘记释放指针指向的资源
class Menory
{
private:
    int* m_p;

public:
    Menory()
    {
        m_p = new int[5];
    }

    ~Menory()
    {

    }

    int* getmemory()
    {
        return m_p;
    }
};

int main()
{
    int* p = nullptr;
    {
        Menory space = Menory();
        p = space.getmemory();
    }


    return 0;
}

在主函数中 出了大括号的作用域后 调用了space的析构函数 但是析构函数中没有delete掉p指向的自由存储区中开辟的内存 该内存仍然是不可用状态 导致了内存泄漏

代码逻辑过早结束,导致释放资源的代码执行不到
int main()
{
    int* p = new int[10];
    if (true)
    {
        return 0;
    }
    delete[] p;
    return 0;
}

在执行到if条件判断后 进入条件判断 程序直接退出 没有执行到delete[] p语句

代码运行过程中,发生异常,直接出当前函数栈帧,导致释放资源的代码执行不到
int main()
{
    int* p = new int[12];
    try
    {
        throw 1;
        throw "error";
    }
    catch (int i)
    {

    }
    catch (char* str)
    {

    }
    delete[] p;
}

抛出异常捕获后 直接回退到上一个栈帧,不执行delete操作

通过裸指针,访问对象时,无法判断对象是否存活,还是已经析构掉
int main()
{
    Menory p1;
    {
        Menory data1 = Menory();
        p1 = Menory();
    }
    cout << *p1.getmemory() << endl;
    return 0;
}

p1所指向的Menory对象作用域在{}中 除了}自动调用p所指向的实例的析构函数,p所指向的实例已经被析构,但是裸指针不能发现。

多个指针指向同一块内存释放导致的失效指针的问题
int main()
{
    int* p = new int[20];
    int* p1 = p;
    delete[] p1;
    return 0;
}

p1和p指向同一块内存 delete p1后p也就失效了 释放p1指向的内存等同于释放p指向的内存

参考连接:https://blog.csdn.net/qq_38684512/article/details/103421567