首页
学习
活动
专区
圈层
工具
发布

你必须知道的指针基础-8.栈空间与堆空间

1.2 不要把局部变量的指针做为返回值返回   首先,我们来看看下面一段代码,其中getData函数返回了一个int数组类型的指针,而getData2函数返回了另一个int数组类型的指针: int *getData...2.2 函数返回指针的几种解决办法   (1)在方法内malloc,用完了由调用者free   这里我们可以结合malloc和free来解决我们在栈空间中所遇到的问题,重写上面的代码如下: int *getData...这下输出的还是getData函数返回的指针所指向的内存区域的数据,没有出现交叉影响,完美! ?   ...(3)(推荐)由调用者分配内存空间,只是把指针发给函数,函数内部把数据拷贝到内存中   这里怎么来理解呢,也就是三个步骤,第一步:由调用者分配内存空间;第二步:把指针传递给函数;第三步:函数内部把数据拷贝到内存中...,程序员手动分配的内存都是在栈空间中,然后函数内部处理后再将经过逻辑处理后的数据存储到栈空间中的指定区域内,最后main函数中再访问修改后的内存区域。

1.6K20

【C++指南】C++内存管理 深度解析

全局变量的作用域是从定义位置开始到整个文件结束(可以通过extern关键字扩展其作用域到其他文件)。其内存空间在程序启动时就已经分配好,并且在整个程序运行期间都存在。...这会在堆中找到一块足够存储int类型数据的空间,并返回该空间的指针,将其存储在p中。...malloc 只是简单地分配指定大小的内存块,例如void* p = malloc(sizeof(int));,它返回一个void*类型的指针,需要手动进行类型转换。...malloc/free: malloc 和 free 的类型安全性相对较差。因为 malloc 返回的是一个void*指针,需要程序员手动进行类型转换。...异常处理和错误返回: new/delete: 在 C++ 中,如果new分配内存失败(例如系统内存不足),会抛出一个bad_alloc类型的异常。

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

    (60) 随机读写文件及其应用 - 实现一个简单的KV数据库 计算机程序的思维逻辑

    随机访问 RandomAccessFile内部有一个文件指针,指向当前读写的位置,各种read/write操作都会自动更新该指针,与流不同的是,RandomAccessFile可以获取该指针,也可以更改该指针...设计 我们采用如下简单的设计: 将键值对分为两部分,值保存在单独的.data文件中,值在.data文件中的位置和键称之为索引,索引保存在.meta文件中。...索引信息既保存在.meta文件中,也保存在内存中,在初始化时,全部读入内存,对索引的更新不立即更新文件,调用flush才更新。...: //索引信息,键->值在.data文件中的位置 Map indexMap; //空白空间,值为在.data文件中的位置 Queue gaps; 表示文件的数据结构是...data文件中的位置。

    1.3K60

    c++的lambda使用注意事项,可能导致的崩溃问题分析

    Lambda表达式是现代C++的一个语法糖,挺好用的。但是如果使用不当,会导致内存泄露或潜在的崩溃问题。这里总结下Lambda表达式的使用注意事项,避免在使用中的一些陷阱。...lambda表达式(也称为lambda函数)是在调用或作为函数参数传递的位置处定义匿名函数对象的便捷方法。通常,lambda用于封装传递给算法或异步方法的几行代码 。...示例三,lambda引用了局部变量divisor, 但是局部变量的生命期在addDivisorFilter返回时终止,也就是在filters.emplace_back返回之后,所以添加到容器的函数本质上就像是一到达容器就死亡了...如果你用值捕获了个指针,你在lambda创建的闭包中持有这个指针的拷贝,但你不能阻止lambda外面的代码删除指针指向的内容,从而导致你拷贝的指针空悬。...正常情况下,lambda表达式中访问类的对象成员变量需要捕获this,但是这里捕获的是this指针,指向的是对象的引用,正常情况下可能没问题,但是如果多线程情况下,函数的作用域超过了对象的作用域,对象已经被析构了

    5K10

    【C++】运算符重载 ⑩ ( 下标 (int i) | 完整代码示例 )

    Test.cpp - 主函数入口 ) 中 , 实现了一个数组类 , 在一个类中 , 封装了一个 int 类型的指针 , 该指针指向堆内存的 内存空间 , 用于存放一个数组 ; 核心是 2 个成员变量..., 记录指向堆内存的指针 , 和 数组长度 ; private: // 数组长度 int m_length; // 指向数组数据内存 的指针 int* m_space; 数组都可以使用下标进行访问...其中 左操作数 是 a , 右操作数 : 运算符里面还有一个 int 类型的索引值 , 是右操作数 ; 如果是成员函数 , 则将重载函数写在 左操作数 中 , 在 重载操作数的 成员函数中 this 指针就是...左操作数 ; 此时只需要额外指定一个 int 类型右操作数 即可 ; operator[](int i) 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ; 要对 Array...数组下标 [] 操作符重载 int& Array::operator[](int i) { return m_space[i]; } 在测试类中 , 使用数组下标为数组设置值 , 并使用数组下标操作符获取数组元素的值

    42130

    数据结构

    随机访问的特点就是不需要从数组的第一个元素开始访问要查找的元素,而是可以直接访问查找的元素,在随机访问中,查找第一个元素和查找最后一个元素所需时间是一样的。...链表 由多个节点(对象)组成,其中每个节点在内存中是散乱存放的,即存放在一个叫做对象堆的不连续地址内存中。其中每个节点(除了尾节点外)都有一个特定的引用下一个节点的变量,从而实现一个完整链表。...链表中的每个元素都称为节点,每个节点包含数据内容和引用后一个节点的变量(通常叫做指针)。 数组中的元素是存储在地址连续的内存中,而链表中的元素则是散乱存放在内存中的。...由于链表的不连续地址内存机制,在往链表插入和删除数据时,不会象数组那样移动其他数据项,而是在空闲内存中为新的节点对象分配空间,然后将该节点和链表中特定位置的节点链接起来。... 对各阶层的节点由低阶层到高阶层,从左至右,由1开始编号,再根据编号将节点数据存入相应索引编号的数组(链表)中  如果某编号没有节点存在,则数组对应位置没有值存入。

    24110

    数组与链表

    而与它相对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系。...,它是通过指针将一组连续的内存块串联起来, 比如申请的是 100MB 大小的链表,不会有问题。...Java中的LinkedHashMap就采用双向链表数据结构 数组与链表区别 数组简单易用,在实现上使用的是连续的内存空间,可以借助 CPU 的缓存机制,预读数组中的数据,所以访问效率更高。...而链表在内存中并不是连续存储,所以对 CPU 缓存不友好,没办法有效预读; 数组的缺点是大小固定:一经声明就要占用整块连续内存空间。...这时只能再申请一个更大的内存空间,把原数组拷贝进去,非常费时; 链表本身没有大小的限制,并且支持动态扩容; 单链表操作 反转 方法一:递归反转法,在反转当前节点之前先反转后续节点。

    75020

    【第3版emWin教程】第22章 emWin6.x的GIF图片显示

    1、 GIF图片显示的所有API函数在emWin手册中都有讲解,下图是中文版手册里面API函数的位置 下图是英文版手册里面API函数的位置: 2、 本章教程使用的外部存储器是SD卡,实际项目中使用任何其它类型的存储器都可以的...GIF格式的另一个特点是其在一个GIF文件中可以存多幅彩色图像,如果把存于一个文件中的多幅图像数据逐幅读出并显示到屏幕上,就可构成一种最简单的动画。...pGIF读取GIF文件数据,返回上次(注意,这里的上次就是指的参数Index所指定的子图片序号,这个参数是从0开始计数的)所绘制的子图片显示位置,长度,宽度和显示多长时间。...GIF图片 绘制加载到存储器的GIF图片主要是通过函数GUI_GIF_DrawSub来实现,下面我们分2步来说明如何将SD卡中的GIF图片显示到LCD上面。...下面我们分2步来说明如何将SD卡中的GIF图片显示到LCD上面。 第1步:将GIF图片复制到SD卡的根目录下,然后直接调用函数GUI_GIF_DrawSubEx就可以显示。

    1.1K40

    SQL语句执行与结果集的获取

    数据源在执行完SQL语句后会返回一个结果集对象,将SQL执行的结果返回到结果集对象中,应用程序在执行完SQL语句后,解析结果集对象中的结果,得到具体的结果,这次的主要内容是如何解析结果集对象并获取其中的值...,第一次调用就是指向第一行,并得到行句柄HROW,这个行句柄表示我们访问的当前是结果中的第几行,一般它的值是一个依次递增的整数 调用IRowset::GetData传入准备好的行缓冲内存指针,以及之前创建的访问器...在程序中并不是所有的访问器都是为了读取数据,而且使用返回所有结果的方式太简单粗暴了,比如我只想要一列的数据那个数据可能占用内存不足1K,但是数据库表中某一列数据特别大,可能占用内存会超过一个G,如果全都返回的话太浪费内存了...所以在绑定时候可以灵活的指定返回那些数据,返回数据长度是多少,针对特别大的数据,我们可以指定它只返回部分,比如只返回前面的1K 使用绑定可以灵活的安排返回数据在内存中的摆放形式。...而绑定结构中的obValue、obLength、obStatus规定了它们三者在一块内存缓冲中的偏移,要注意后面一列的开始位置是在前面一列的结束位置而不是所有数据都是从0开始。

    4.6K20

    C++避坑指南

    上述String类存在到const char *的隐式转换,strcat函数返回时String隐身转换成const char *,而String对象已经被销毁,返回的const char *指向无效的内存区域...operator type()在条件运算中,可以进行隐式转换,这就是为什么C++中的智能指针如shared_ptr的operator bool()加了explicit还能直接进行条件判断的原因。...auto_ptr ap1(new string("foo"));auto_ptr ap2 = ap1;//内存访问错误,ap1管理的指针已经被置位空string str(...可能产生①③②的顺序,此时如果③getData()产生异常,而new Handler对象指针还没有托管到shared_ptr中,于是内存泄漏发生。使用make_shared可以避免这个问题。...如果make_shared先调用,在getData被调用前动态分配的Hander对象已经被安全的存储在返回的shared_ptr对象中,接着即使getData产生了异常shared_ptr析构函数也能正常释放

    2.1K30

    java实现数据结构

    顺序存储结构 : 把逻辑上相邻的节点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现....(数据元素的存储对应于一块连续的存储空间,数据元素之间的前驱和后续关系通过数据元素,在存储器中的相对位置来反映) 例如 : 0 1 ......last 特点 : 在内存中分配连续的空间,只存储数据,不需要存储地址信息.位置就隐含着地址....循环链表 在一个循环链表中,首节点和末节点被连接在一起.这种方式在单向和双向链表中皆可实现.要转换一个循环链表,你开始于任意一个节点然后沿着列表的任一方向直到返回 开始的节点.循环链表可以被视为"无头无尾...7 遍历(Traverse) : 就是按照某种次序访问树中的所有结点,且每个结点恰好访问一次.也就是说,按照被访问的次序,可以得到由树中所有结点排成的一个序列.树的遍历也可以看成是人为的将 非线性结构线性化

    1.2K81

    Java多线程——对象及变量的并发访问

    本篇文章主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题。...如上图所示,线程1修改X变量,是在自己工作内存中进行修改的,并未及时刷新到主内存中,如果这时候线程2去读取主内存中的数据X读取到的还是0,但实际上X已经被修改成1了,这就是线程可见性有可能出现的问题。...有序性: 有序性(Ordering)指在什么情况下一个处理器上运行的一个线程所执行的内存访问操作在另外一个处理器上运行的其他线程看来是乱序的(Out of order)。...所谓乱序,是指内存访问操作的顺序看起来像是发生了变化。...a num=100 b set over b num=200 实验结论:在两个线程访问同一个对象中的同步方法时一定是线程安全的。

    2.4K20
    领券