栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ unique

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ unique

裸指针在使用的时候,需要手动new和delete,有时候忘记delete就会造成内存泄漏。
所以出现了智能指针,可以帮助我们去管理内存的删除操作。本文只讲unique_ptr的使用。
unique_ptr对象包装一个原始指针,并负责其生命周期。当该unique_ptr对象被销毁时,会在其析构函数中删除关联的原始指针。

创建方式
  1. 使用原始指针创建
std::unique_ptr pPerson1(new Person("P1"));
  1. 使用make_unique来创建
std::unique_ptr pPerson2 = std::make_unique("P2");
常用函数 get

用途:获取被管理的裸指针。

std::unique_ptr pPerson2(new Person("P2"));
Person* pRaw2 = pPerson2.get();
release

用途:释放其关联的原始指针的所有权,并返回原始指针,但是并未delete原始指针。

std::unique_ptr pPerson2(new Person("P2"));
Person* pRaw2 = pPerson2.release();
reset

用途:重置unique_ptr为空,并delete原始指针。

std::unique_ptr pPerson2(new Person("P2"));
Person* pRaw2 = pPerson2.reset();
函数使用场景
static std::vector Persons;

void AddPerson()
{
    auto a = std::make_unique("Px");
    Persons.push_back(a.get());
}

int main()
{
    AddPerson();
}

在上面的代码段中,vector容器用来存放Persons类型的指针,执行了AddPerson之后,发现Persons中存放的都是野指针,先说正确的做法:

Persons.push_back(a.release());

那么两者有什么区别呢?

  1. get,即并没有释放对于指针a的所有权,unique_ptr仍然在管理指针a,所以出了函数AddPerson作用域之后,unique_ptr就会自动销毁指针a,那当然就变成野指针了。
  2. release,即交出了(也应该交出)对于指针a的所有权,交由后面的使用者管理,所以出了函数AddPerson作用域之后,指针a不会被删除
  3. 即使用了release,在Persons不再使用的时候,也不能忘记对vector内的每一个指针进行delete。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/997160.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号