智能指针之唯一指针

智能指针如std::unique_ptr用于解决原生指针可能导致的安全问题,如悬挂指针、多次释放和野指针。它们确保唯一所有权,不允许复制,支持转移所有权,并在适当时候自动释放内存。通过std::make_unique可以更安全地创建对象和数组。当智能指针离开作用域或调用reset时,关联的内存会被清理。转移所有权使用std::move,防止内存泄露。
摘要由CSDN通过智能技术生成

出现的原因

智能指针的出现是为了解决原生指针的安全问题,比如悬挂指针、多次释放、野指针等问题

语法

std::unique_ptr<类型>变量名 {  }

std::unique_ptr <int>ptr {new int(5)};

这个例子中,不能用ptr【0】这种方式来访问,而原生数组可以,这就是智能指针的安全性

创建数组的内存

std::unique_ptr <int[] >ptr {new int[5]{1,2,3,4,5}};

这个例子中,就只能用ptr【0】的方式访问,而不能用*ptr的方式

特点

unique_ptr:唯一指针

一个内存地址只能有一个指向

std::unique_ptr <int>ptrA {new int(5)};
std::unique_ptr <int>ptrB {};
ptrB=ptrA

这三行代码不能通过编译,因为它是唯一指针

C++14新语法

用std::make_unique<int>进行赋值

std::unique_ptr<int> ptrA {std::make_unique<int>(5)};
std::unique_ptr<int[]> ptrA {std::make_unique<int[]>(5)};

第二行的5表示数组元素有5个

reset方法

ptr.reset();

将指针赋值为nullptr,同时将内存清空

get方法

ptrA.get();

返回ptr的值

release()

ptr.release();

不会释放内存空间,只是将指针设置为nullptr,即返回ptr的值,并将其赋值为0

转移

智能指针不能复制,但是可以转移

语法

转移后的指针变量=std::move(转移前的指针变量)

转移后,原先的指针变量变成nullptr,因为要保证智能指针的唯一性

std::unique_ptr <int>ptrA {std::make_uniuqe<int>(5)};
std::uniuqe_ptr <int>ptrB;
ptrB=std::move(ptrA);

此时,ptrA变成nullptr

代码实战

int* p;
{
    int a=new int[50];
    
    p=a;

    a[2]=255;
}
std::cout <<p[2];

这里,变量a遇到括号就结束了生命周期,但是内存空间还在,p[2]还是可以访问,这就是野指针

这里就要用到智能指针来处理

int* p;
{
    std::unique_ptr<int[]>a{std::make_unique<int[]>(50)};
    
    p=a;

    a[2]=255;
}
std::cout <<p[2];

这里,不仅将a[2]内存空间释放掉了,还讲p设置为nullptr,这就是智能指针

int* p;
{
    int* a=new int[5];
    
    p=a;

    a[2]=255;
    delete[] a;
}
std::cout <<p[2];

这里清空了a的内存,但是p却在这之前指向了.a,这就是释放了内存,但没有清空指针,就会出错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值