既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
void MemoryLeaks()
{
// 1.内存申请了忘记释放
int* p1 = (int*)malloc(sizeof(int));
int* p2 = new int;
// 2.异常安全问题
int* p3 = new int[10];
Func(); // 这里Func函数抛异常导致 delete[] p3未执行,p3没被释放.
delete[] p3;
}
三.智能指针的使用及原理
============
RAII
RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源的技术。
在对象构造时获取资源,最后在对象析构时释放资源。
template
class SmartPtr {
public:
-
SmartPtr(T* ptr = nullptr)
- _ptr(ptr)
{}
~SmartPtr()
{
if(_ptr)
delete _ptr;
}
private:
T* _ptr;
};
void MergeSort(int* a, int n)
{
int* tmp = (int*)malloc(sizeof(int)*n);
SmartPtr sp(tmp);
}
int main()
{
try {
int a[5] = { 4, 5, 2, 3, 1 };
MergeSort(a, 5);
}
catch(const exception& e)
{
cout<<e.what()<<endl;
}
return 0;
}
智能指针的原理
上面的smartptr还不能将其称为指针,还需要重载->,*才能像指针一样。
template
class SmartPtr {
public:
-
SmartPtr(T* ptr = nullptr)
- _ptr(ptr)
{}
~SmartPtr()
{
if(_ptr)
delete _ptr;
}
T& operator*() {return _ptr;}//重载
T* operator->() {return _ptr;}//重载->
private:
T* _ptr;
};
struct Date
{
int _year;
int _month;
int _day;
};
int main()
{
SmartPtr sp1(new int);
*sp1 = 10
cout<<*sp1<<endl;
SmartPtr sparray(new Date);
sparray->_year = 2018;
sparray->_month = 1;
sparray->_day = 1;
}
std::auto_ptr
C++98版本就提供了auto_ptr的智能指针。
#include
class Date
{
public:
Date() { cout << “Date()” << endl;}
~Date(){ cout << “~Date()” << endl;}
int _year;
int _month;
int _day;
};
int main()
{
auto_ptr ap(new Date);
auto_ptr copy(ap);
// auto_ptr的问题:当对象拷贝或者赋值后,前面的对象就悬空了
// C++98中设计的auto_ptr问题是非常明显的,所以实际中很多公司明确规定了不能使用auto_ptr
ap->_year = 2018;
return 0;
}
template//底层实现
class AutoPtr
{
public:
AutoPtr(T*ptr = NULL)
:_ptr(ptr)
{}
~AutoPtr()
{
if(_ptr)
delete _ptr;
}
-
AutoPtr(AutoPtr& ap)
- _ptr(ap._ptr)
{
ap._ptr = NULL;
}//拷贝后,ap与其管理的资源断开联系,避免一块空间被多个对象使用
AutoPtr& operator=(AutoPtr& ap)
{
// 检测是否为自己给自己赋值
if(this != &ap)
{
// 释放当前对象中资源
if(_ptr)
delete _ptr;
// 转移ap中资源到当前对象中
_ptr = ap._ptr;
ap._ptr = NULL;
}
return *this;
}
T& operator*() {return *_ptr;}
T* operator->() { return _ptr;}
private:
T* _ptr;
};
std::unique_ptr
C++11中提供更靠谱的unique_ptr
int main()
{
unique_ptr up(new Date);
// unique_ptr的设计思路非常的粗暴-防拷贝,也就是不让拷贝和赋值。
unique_ptr copy(ap);
return 0;
}
template//底层实现
class UniquePtr
{
public:
-
UniquePtr(T * ptr = nullptr)
- _ptr(ptr)
{}
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
class UniquePtr
{
public:
-
UniquePtr(T * ptr = nullptr)
- _ptr(ptr)
{}
[外链图片转存中…(img-paSDTVIs-1715623071530)]
[外链图片转存中…(img-bL6r0S2N-1715623071531)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新