首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

第 12 章 动态内存

动态内存使用很容易出问题。有时我们会忘记释放内存,在这种情况下就会产生内存泄漏;有时在尚有指针引用内存情况下我们就释放了它,在这种情况下就会产生引用非法内存指针。...weak_ptr,弱引用,控制所指向对象生存期,指向 shared_ptr所管理对象。 默认初始化 shared_ptr对象是一个空指针,在使用之前需要进行初始化。...一个例子就是将 shared_ptr存放于一个容器,而后不再需要全部元素,而只是使用其中一部分,要记得掉用容器 erase操作删除不再需要元素。...对于 shared_ptr类模板,删除器是类模板 function数据成员,可以通过拷贝构造函数或 reset函数进行更改。...objT, fcn); weak_ptr,控制所指向对象生存期智能指针,指向由一个 shared_ptr管理对象。

1.4K40
您找到你想要的搜索结果了吗?
是的
没有找到

动态内存与智能指针

delete 接受一个动态对象指针,销毁对象并释放相关内存 动态内存管理十分困难,有时候会忘记释放内存,这种情况下会产生内存泄漏。...有时在尚有指针引用内存情况下我们就释放了它,在这种情况下就会产生引用非法内存指针。 为了更容易也更安全使用动态内存,新标准提供了两种智能指针类型来管理动态对象。...在这种情况下应该确保使用earse删除某些不再需要shared_ptr 元素 直接管理内存 相对与智能指针直接使用new 和 delete很容器出错。...对于一块内存只有在没有任何智能指针指向它情况下,智能指针才会自动释放它 shared_ptr 和 new 结合使用 接受指针参数智能指针构造函数是 explicit 。...我们也可以重载一个unique_ptr 默认删除器。但是unique_ptr 管理删除方式与shared_ptr 不同。

82320

【笔记】《C++Primer》—— 第12章:动态内存

,标准库在头文件memory定义了两个智能指针:允许多个指针指向同个对象shared_ptr指针独占对象unique_ptr,还有一个伴随弱引用指针weak_ptr。...智能指针操作并不复杂,归功于C++强大自定义能力,除了初始化之外很多时候操作与内置指针相同。...,且此对象参数必须时一个该类型元素指针 // 自定义删除器函数,常常用来处理那些由工厂产生对象,各种connection void newDeleteFun(int* inp) {...delete应只用在动态数组首指针,用在其他指针上都是未定义 动态数组一样可以由unique_ptr来管理,我们也一样可用下标访问其中元素 但是shared_ptr直接支持管理动态数组,当用shared_ptr...管理时我们需要提供自己删除器且不能用下标访问元素而是需要用get得到内置指针来访问 处于灵活性考虑,有时候我们希望能得到一块连续内存但先初始化它,此时我们可以用allocator类来处理,而且大多数时候我们用它分配动态数组可以得到更高效率并更好管理

46910

《C++Primer》第十二章 动态内存

这种管理方式有两个问题: 如果我们忘记释放内存,就会造成内存泄漏 如果在有指针引用内存情况下我们就释放它,就会出现“野指针” 新标准库提供了三种智能指针smart pointer: shared_ptr...有一种常见例子是: 你将shared_ptr存放在一个容器之中,随后重排了容器不再需要某些元素。在这种情况下,你应该使用erase删除那些不再需要shared_ptr元素。...= nullptr; // 指出p不再绑定任何对象 // 这时候q变成“空悬指针”,查找指向相同内存所有指针是异常困难 2.3 shared_ptr和new结合使用 如果我们初始化一个智能指针...如果我们不用另一个智能指针来保存release返回指针,我们就要负责资源释放: p2.release(); // 错误:p2不会释放内存,而且我们丢失指针 auto p = p2.release...return ret; } 类似于shared_ptr,unique_ptr默认情况下使用delete释放它指向对象,我们重载一个删除器,但是unique_ptr管理删除方式和shared_ptr

1.3K10

【C++】智能指针详解

在C++,动态内存管理是用一对运算符完成:new和delete,new:在动态内存为对象分配一块空间并返回一个指向该对象指针,delete:指向一个动态独享指针,销毁对象,并释放与之关联内存...动态内存管理经常会出现两种问题:一种是忘记释放内存,会造成内存泄漏;一种是尚有指针引用内存情况下就释放了它,就会产生引用非法内存指针。...如果你将shared_ptr存放于一个容器,而后不再需要全部元素,而只使用其中一部分,要记得用erase删除不再需要那些元素。...动态内存一个基本问题是可能多个指针指向相同内存 shared_ptr和new结合使用 如果我们初始化一个智能指针,它就会被初始化成一个空指针,接受指针参数职能指针是explicit,因此我们不能将一个内置指针隐式转换为一个智能指针...用unique_ptr传递删除器 unique_ptr默认使用delete释放它指向对象,我们可以重载一个unique_ptr默认删除器 我们必须在尖括号unique_ptr指向类型之后提供删除器类型

76230

【C++11】 使用C++11解决内存泄露--智能指针

众所周知,C#和java不需要开发人员自己释放内存,对象引用计数为零后.Net和Java虚拟机会对对象进行自动回收,从而防止内存泄露;但是C++语言中,在堆上分配内存必须自己去管理,不用时候要自己释放...1.2 获取原始指针 代码可以使用get方法获取原始指针代码所示: int main () { int* p = new int (10); std::shared_ptr a...运行结果如下: a and p point to the same location 10 10 10 1.3 指定指针删除器 智能指针在初始化时可以指定删除器,在指针计数为零时,自动调用指定删除器从而释放指针指向内存存...,删除器可以是一个函数,也可以是一个lambda表达式,代码所示: void DeletePoint(int *p){ delete p; } int main(){ std::shared_ptr...弱指针除了上面描述功能外,在shared_ptr返回this指针实现也是使用了弱指针方法才得以实现,同理,在解决循环引用问题时,只需要将两个类任意一个类成员使用弱指针,循环引用导致内存泄露问题都可以顺利解决

64810

C++智能指针

这三种类型都定义在memeory头文件。 原理: 将我们分配动态内存都交给有生命周期对象来处理,当对象过期时,让它析构函数删除指向内存。...//多数情况下没必要,都主动释放了,那么我们使用智能指针意义在哪呢?...release返回指针通常被用来初始化另一个智能指针或给另一个智能指针赋值。在本例,管理内存责任简单地从一个指针转给了另一个。...但是如果我们不用另一个智能指针来保存release返回指针,我们程序就要负责资源释放。 p2.release();//错误,p2不会释放内存,而且我们丢失指针。... sp5(new T(), D()); //定义shared_ptr,指向类型为T对象,接受一个D类型删除器,使用D删除器来释放内存 数组对象管理: shared_ptr

40620

什么是智能指针

对于特定对象,只能有一个智能指针可拥有,这样只有拥有对象智能指针构造函数会删除该对象。然后让赋值操作转让所有权。...shared_ptr 和 weak_ptr shared_ptr 是目前工程内使用最多最广泛智能指针,它使用引用计数实现对同一块内存多个引用,在最后一个引用被释放时,指向内存才释放,这也是和 unique_ptr...after leave the scope, crash 禁止使用指向 shared_ptr 指针,也就是智能指针指针,这听起来就很奇怪,但开发我们还需要注意,使用 shared_ptr 指针指向一个...这样情况包括: 有一个指针数组,并使用一些辅助指针来标示特定元素,最大元素和最小元素; 两个对象包含都指向第三个对象指针; STL 容器包含指针。...可以将 unique_ptr 存储到 STL 容器,只要不调用将一个 unique_ptr 复制或赋给另一个算法( sort())。例如,可在程序中使用类似于下面的代码段。

59720

彻底搞懂之C++智能指针

前言 在现代 c + + 编程,标准库包含 智能指针,这些指针用于帮助确保程序不会出现内存和资源泄漏,并具有异常安全。...shared_ptr shared_ptr 类型是 C++ 标准库一个智能指针,是为多个所有者可能必须管理对象在内存生命周期方案设计。...我简单总结下就是:将基本类型指针封装为类对象指针(这个类肯定是个模板,以适应不同基本类型需求),并在析构函数里编写delete语句删除指针指向内存空间。...但是,你可以使用 weak_ptr 来尝试获取用于初始化新副本 shared_ptr 。 如果已删除内存,则 bool 运算符将 weak_ptr 返回 false 。...这样情况包括: 有一个指针数组,并使用一些辅助指针来标示特定元素,最大元素和最小元素; 两个对象包含都指向第三个对象指针; STL容器包含指针

3.3K10

C++智能指针详解

并且这些智能指针实现是参照boost实现。 1.3 为什么需要智能指针 1.3.1 内存泄漏 我们在讲为什么之前先来了解一下什么是内存泄漏。...内存泄漏危害:长期运行程序出现内存泄漏,影响很大,操作系统、后台服务等等,出现 内存泄漏会导致响应越来越慢,最终卡死。...,在异常重新抛出与捕获,可以用智能指针解决。...智能指针众多版本 C++存在4种智能指针:auto_ptr,unquie_ptr,shared_ptr,weak_ptr,他们各有优缺点,以及对应实用场景。...当shared_ptr对象生命周期结束时就会调用传入删除器完成资源释放,调用该删除器时会将shared_ptr管理资源作为参数进行传入。

9210

计算机考研复试C语言常见面试题「建议收藏」

为了解决循环引用导致内存泄漏,引入了弱指针weak_ptr,weak_ptr 是一种控制对象生命周期智能指针, 它指向一个 shared_ptr 管理对象....,shared_ptr p = pa->pb_.lock(); p->print(); 补充:智能指针泄露问题 当两个对象相互使用一个shared_ptr成员变量指向对方,会造成循环引用,使引用计数失效...把类A里面的shared_ptr pb_,改为weak_ptr pb_即可 12、野指针指针就是指向一个已删除对象或者所指向空间是访问受限空间指针。...15、虚函数与纯虚函数 定义一个函数为虚函数,代表该函数没有被实现,而是为了允许用基类指针来调用子类这个函数。 定义一个函数为纯虚函数,才代表函数没有被实现。...在基类实现纯虚函数方法是在函数原型后加“=0” :virtual void funtion1()=0 如果Avirtual去掉以后,以上结果将会是Afoo 16、为什么析构函数必须是虚函数

1.5K30

【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr

在现代 C + + 编程,标准库包含智能指针,智能指针可处理对其拥有的内存分配和删除,这些指针用于帮助确保程序不会出现内存和资源泄漏,并具有异常安全。...资源(堆内存、文件句柄、套接字等)应由对象“拥有”。 该对象在其构造函数创建或接收新分配资源,并在其析构函数中将此资源删除。...该指针最常用情况是单例模式和编译防火墙封装。 如果非要抬杠,使用 get() 函数获取到裸指针给另外一个裸指针,那么你使用智能指针意义又何在呢?...所托管指针都指向同一块内存空间。...此函数速度更快,导致内存碎片更少,但在一次分配时不存在异常,而不是在另一种分配上。 通过使引用对象和更新智能指针引用计数代码具有的更好地址来提高性能。

98020

C++(STL):03---智能指针shared_ptr

//指向intlistif(p1 && p1->empty())*p1="h1"; 二、make_shared函数 最安全分配和使用动态内存方法就是调用该函数 此函数在内存动态分配对象并初始化,...此函数设计情况:我们需要向不能使用智能指针代码传递一个内置指针 get函数将内存访问权限传递给一个指针,但是之后代码不会delete该内存情况下,对get函数使用才是最安全 永远不要用get...但是我们可以使用shared_prt语法来指定删除器函数,那么在shared_ptr生命周期结束时就会自动调用这个函数 演示案例: 下面演示一个shared_ptr指定删除器函数以及避免内存泄露案例...//使用这个连接//当f函数退出或者异常退出,p都会调用end_connection函数} 十二、shared_prt与动态数组使用 与unique_ptr不同,shared_ptr直接支持管理动态数组...如果希望使用shared_ptr管理动态数组,必须提供自己定义删除器 如果未提供删除器,shared_ptr默认使用delete删除动态数组,此时delete少一个“[]”,因为会产生错误 //本例

1.5K20

C++智能指针unique_ptr、shared_ptr和weak_ptr

①unique_ptr 在C++,unique_ptr是一个智能指针(smart pointer)类模板,用于管理动态分配内存资源,它提供了自动释放内存功能。...可自定义删除器:unique_ptr可以通过模板参数来指定一个删除器(deleter)函数对象,用于在释放内存时执行额外清理操作。...②shared_ptr 在C++shared_ptr是一个智能指针(smart pointer)类模板,用于管理动态分配内存资源。...这种情况下,每个对象引用计数都不会变为0,导致内存泄漏。 具体来说,当两个对象相互持有shared_ptr时,它们引用计数始终大于0,因此它们所指向内存块永远不会被释放。...解决循环引用问题:由于 weak_ptr 增加引用计数,可以用于解决两个或多个对象之间循环引用问题,避免内存泄漏。

48520

让你代码更CPP一点(前缀树示例)

5.智能指针shared_ptr和make_shared) 我在刷题时候,由于是参考了JAVA版,在JAVA可以靠JVM垃圾回收机制,特别是考虑到大数据问题,在栈区建立一个链表或者树结构可能会导致空间不够...即使new和delete已经比C分配内存方便多了,但还是繁琐,因此我们可以使用智能指针来让程序自动维护开辟空间!以防止由于我们不当操作出现内存泄露和野指针问题!...在C++11,智能指针包含在,分为shared_ptr、unique_ptr、weak_ptr,其中shared_ptr允许多个指针指向同一个对象,而unique_ptr为独占式占有一个对象...当有一个新shared_ptr指向同一个对象时(复制shared_ptr等),引用计数加1。当shared_ptr离开作用域时,引用计数减1。当引用计数为0时,释放所管理内存。...由于shared_ptr是一个类模板,因此不可以直接使用指针对其进行赋值!但一般建议使用new方法对智能指针初始化,这样会造成阅读代码困惑!建议使用make_shared函数进行初始化!

62520

被蚂蚁面试官拷打了,基础真的是太重要了...

它适用于存储一系列相关字符串或整数,例如在哈希表或列表存储多个键值对。 它是一种可变数据结构,可以在创建新节点情况下修改节点值。...8、C++shared_ptr和unique_ptr区别与联系(unique_ptr只有一个,shared_ptr可以共享) 内存管理方式: unique_ptr:独占式智能指针,它“独占”所指向对象...性能开销: shared_ptr由于需要维护引用计数,因此在某些情况下可能比unique_ptr有更大性能开销。...但是,这种开销在大多数情况下可以忽略不计,除非在极端情况下需要频繁地创建和销毁智能指针。 使用场景: unique_ptr适用于独占某个资源情况,例如一个动态分配内存块只能被一个指针所管理。...shared_ptr适用于多个指针共享同一个资源情况,例如多个指针指向同一个动态分配数组或对象。

16321

Effective C++第17条:要在单独语句中使用智能指针来存储由new创建对象

processWidget 可以使用智能指针来动态分配其需要处理 Widget 。...tr1::shared_ptr 构造函数包含了一个 explicit 指针,于是便不存在从“ new Widget ”语句返回指针到 processWidget 所需 tr1::shared_ptr...在这种情况下,由于“ new Widget ”返回指针不会如我们所愿保存在 tr1::shared_ptr ,因此它很有可能会丢失,于是内存泄漏就发生了。...由于这段改进代码,“ new Widget ”语句以及对 tr1::shared_ptr 构造函数调用在单独语句中,对 priority 调用在另一个单独语句中,所以编译器就没有机会调换处理顺序了...牢记在心 在单独语句中使用智能指针来保存由new创建对象。如果这样做,你程序会在抛出异常时发生资源泄漏。

44060
领券