内容纲要
目录
指针的声明
智能指针的智能二字,主要体现在用户可以不关注资源的释放,
因为智能指针会帮你完全管理资源的释放,任何情况下资源到期都会释放
//裸指针
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