2024年最新C++智能指针(1),超通俗解析

img
img

既有适合小白学习的零基础资料,也有适合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)

{}

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

class UniquePtr

{

public:

UniquePtr(T * ptr = nullptr)
_ptr(ptr)

{}

[外链图片转存中…(img-paSDTVIs-1715623071530)]
[外链图片转存中…(img-bL6r0S2N-1715623071531)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值