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

realloc()是否释放旧内存(当旧内存可能是指向其他内存的指针时)?

realloc()函数在重新分配内存时,会根据需要进行内存的扩展或缩小。当旧内存指针指向其他内存时,realloc()函数会将旧内存的内容复制到新分配的内存中,并释放旧内存。

具体来说,realloc()函数会根据新的内存大小重新分配内存,并返回一个指向新内存的指针。如果分配成功,则可以使用该指针访问新分配的内存。同时,realloc()函数会尽可能地将旧内存的内容复制到新分配的内存中,以保留原有数据。如果旧内存指针指向其他内存,realloc()函数会将旧内存的内容复制到新分配的内存中,并释放旧内存。

realloc()函数的使用场景包括但不限于:

  1. 动态调整数组大小:当需要改变数组大小时,可以使用realloc()函数重新分配内存。
  2. 动态管理内存:当需要根据实际需求动态分配或释放内存时,可以使用realloc()函数。

腾讯云提供了云计算相关的产品和服务,其中包括云服务器、云数据库、云存储等。具体推荐的腾讯云产品和产品介绍链接地址如下:

  1. 云服务器(CVM):提供弹性计算能力,支持多种操作系统和应用场景。了解更多:https://cloud.tencent.com/product/cvm
  2. 云数据库MySQL版(CDB):提供高可用、可扩展的数据库服务,适用于各种应用场景。了解更多:https://cloud.tencent.com/product/cdb
  3. 云对象存储(COS):提供安全、可靠、低成本的对象存储服务,适用于海量数据存储和访问。了解更多:https://cloud.tencent.com/product/cos

以上是关于realloc()函数释放旧内存的回答,以及相关的腾讯云产品推荐。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C语言进阶内置函数补充

说明:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。 当内存不再使用时,应使用free()函数将内存块释放。 注意:这里原始内存中的数据还是保持不变的。...这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时, realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。...分配一个newsize的内存块,返回一个指向该内存块的指针。 如果newsize大小为0,那么释放mem_address指向的内存,并返回null。...: image.png 上面的分析基本没有问题,但有两点要注意: 1.返回值可能与ptr的值不同,如果是不同的话,那么realloc函数完成后,ptr指向的旧内存已被free(释放)掉了。...故: image.png 语句有这么一个问题,调用前p指向一个已分配成功的内存,而调用realloc时却失败(即返回NULL),此时,p原来指向的内存还没有free(释放)掉,而现在又找不到地址,这样就出现

67420
  • 【C语言】动态内存的管理

    = ptr)//判断ptr指针是否为空 { int i = 0; for(i=0; i<num; i++) { *(ptr+i) = 0; } } free(ptr);//释放ptr所指向的动态内存...return 0; } 看这个例子就是典型的动态内存的开辟和回收,malloc开辟空间,然后判断一下是不是开辟空间失败,若失败返回空指针,当动态内存你使用完毕之后,用free释放,释放后的指针是野指针,...= NULL) { ptr = p; } //业务处理 free(ptr); return 0; } realloc在vs上,是情况2的情况,自动释放旧的动态空间,在新的动态空间里开辟更大的空间...,自动把就空间的数据拷贝一份到新空间,返回新空间的初始指针,所以不用再用free释放旧空间,只需释放realloc开批的新空间,记住realloc开辟的新空间也有可能开辟失败,若开辟失败,返回空指针。...*) malloc ( 100 ); p++; free (p); //p 不再指向动态内存的起始位置 } 这个p指针发生改变,不在指向动态内存的起始位置,释放时只释放p

    10210

    C语言(15)----动态内存讲解

    1.malloc void* malloc (size_t size);  该函数向内存申请一块size大小的内存,然后返回指向该内存的指针。...若开辟成功,则返回指向该内存的指针; 若开辟失败,则返回空指针。...3.realloc void* realloc (void* ptr, size_t size); 该函数可以对过去已经申请过的内存空间的大小进行变动。...可以根据下图理解: b.开辟的新空间并不冲突,那么直接根据需要扩大的空间大小差值扩大,返回旧的起始地址 然而当要调整的地址是空指针NULL时,那么realloc的作用就与malloc相同。...四.常见错误 1.申请的内存为NULL,并且对其进行解引用操作,即未判读是否为空指针 2.越界访问 void test() { int i = 0; int *p = (int *)malloc(

    23010

    【C语言】动态内存管理

    void free(void* ptr); ptr指向的空间必须是动态内存开辟的,否则free函数的行为是未定义的。如果 ptr 是空指针NULL,那就啥都不做。...return 0; } 【注意】 p指向的空间在释放后不属于当前程序,但仍然存有其起始地址,此时p就是野指针。所以将p置为NULL,防止非法访问。 记得检查p是否为空指针。 记得释放申请的动态内存。...答:原本申请的空间出了大括号会自动释放空间,还给操作系统,但malloc申请的空间需要free函数来手动释放,如果不释放,程序结束时也会被操作系统自动回收,但最好手动释放。 2....返回的可能是旧空间的起始地址,也可能是新空间的起始地址。...常见动态内存的错误 3.1 对NULL指针的解引用操作 void test() { int* p=(int*)malloc(10); *p=20; //未检测p是否为空指针,若

    8010

    关于我、重生到500年前凭借C语言改变世界科技vlog.21——动态内存管理

    ptr);//释放ptr所指向的动态内存 ptr = NULL;//是否有必要?...传送门:realloc-C++参考 参数:ptr-指向先前使用或分配的内存块的指针,size-元素大小 返回值:指向重新分配的内存块的指针 值得注意的是: • ptr 是要调整的内存地址 • size...类型数据的内存需求),realloc 函数会返回 NULL,但这里的问题是,当它返回 NULL 时,原始的 ptr 所指向的内存块已经被释放(因为 realloc 在尝试重新分配失败时,会释放掉原始的内存块以避免内存泄漏...,同样执行 p = realloc(ptr, 1000),当重新分配成功时,通过判断 p!...赋给 ptr,所以 ptr 仍然指向原来的内存块(前提是原来的内存块还未被 realloc 释放,在这种情况下,原来的内存块未被释放是因为重新分配失败后没有进行释放原始内存块的操作),这样就可以避免丢失原始数据以及出现空指针错误

    9510

    动态内存管理

    如果开辟成功,则返回一个指向开辟好空间的指针。...*(ptr + i) = 0; } } free(ptr);//释放ptr所指向的动态内存 ptr = NULL;//是否有必要?...1.开辟新的空间 2.会将旧的空间的数据拷贝到新的空间 3.释放旧的空间 4返回新空间的起始位置 由于上述的两种情况,realloc函数的使用就要注意一些。...(p);//p不再指向动态内存的起始位置(一次释放就直接释放所以) (小心不要让指针跑偏) } 3.5 对同一块动态内存多次释放 void test() { int* p =...C/C++程序的内存开辟 C/C++程序内存分配的几个区域 1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。

    10610

    【C语言进阶篇】常用动态内存分配 malloc calloc realloc free

    : 1️⃣ 动态内存函数 malloc 动态内存开辟的函数: malloc void* malloc (size_t size); 这个函数向内存申请一块 连续可用 的空间,并返回指向这块空间的指针...如果开辟成功,则返回一个指向开辟好空间的指针。 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。...malloc申请空间会主动释放嘛   ⛳️而malloc申请的空间,当程序退出时,才会还给操作系统,而当程序未结束时,动态内存申请的内存空间,是不会主动释放的。这样就会照成内存的浪费!...✅情况二   ⛳️当我们想用reaclloc增加空间时,但是后面空间不够了就会重新开辟新空间并将原来空间的内容拷贝到新空间,并且将旧空间释放掉....本来我p指针变量还维护40个字节的大小结果你给一个空指针 那么我不仅新空间没开辟,旧空间也丢了, 这样就会造成内存泄漏的问题,所以我们在这里就不敢用p接收我们的realoc返回值,需要进行代码改进!

    57610

    C语言-动态内存管理

    ;//函数原型 这个函数向内存中申请了一块连续可用的空间,并且返回指向这个空间的指针。...如果开辟成功,返回一个指向该空间的指针。 如果开辟失败,则返回一个空指针NULL。...明明我指向那块空间,但是那块空间却不属于我,明明喜欢那个女孩,但是那个女孩却不喜欢我。这就是如果不给free赋上空指针的结果。 关于野指针的危害前面也有介绍,这里就不细说了。...如果原来空间不够开辟要扩展的空间,那么realloc就会在内存中新找一块大小合适的空间俩开辟,并会将就空间的数据拷贝到新空间内,最后释放旧的空间,并返回新空间的地址 因此,关于realloc的返回值,我们是否还能拿...如果是情况1的话,ptr的值等于p,所以赋值等于没赋;如果时情况2的话,p指向的那块旧的地址释放掉了,因此我们将ptr的地址(也就是新开辟的空间的起始地址)给到p。

    7810

    C语言——O动态内存管理

    二、malloc 和 free 1、malloc C语言提供了⼀个动态内存开辟的函数: void* malloc (size_t size); 这个函数向内存申请⼀块连续可⽤的空间,并返回指向这块空间的指针...• 如果开辟成功,则返回⼀个指向开辟好空间的指针。 • 如果开辟失败,则返回⼀个 NULL 指针,因此 malloc 的返回值⼀定要做检查。...free(p);//释放p所指向的动态内存 ptr = NULL;//防止p成为野指针 return 0; } 三、calloc和realloc 1、calloc C语⾔还提供了⼀个函数叫...这样函数返回的是⼀个新的内存地址,同时把旧的数据拷贝到新的空间中,然后释放空间。 由于上述的两种情况,realloc函数的使⽤就要注意⼀些。...栈区(stack):在执⾏函数时,函数内局部变量的存储单元都可以在栈上创建,函数执⾏结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很⾼,但是分配的内 存容量有限。

    11110

    动态内存管理

    如上图,我们释放时,只是释放了开辟的空间,但p还是指向那个地址,因此,我们会在free之后将该指针变为空指针,否则该指针就是野指针,野指针是危险的。...释放掉旧的空间。 realloc函数返回新的空间的地址。 realloc也能做malloc能做的事,如果参数1是空指针,上方realloc函数的作用跟注释中malloc函数的作用一样。...修改后的代码如下: 题2 分析:p的地址返回给str,但返回时,该空间已经销毁了,即没有了该空间的使用权,str指向了p所指向的地址,但此时str是野指针。...题3 分析:缺少free,造成内存泄露。 题4 分析:free后,str指向的空间被释放了,但他依旧指向该地址。strcpy时,此时str为野指针,对野指针进行操作,非法访问内存。...在释放时,只需要释放一次。 分析组1:组1先是malloc一块空间,然后在data中再malloc一块空间。空间不足时,再realloc调整,然后把新空间的地址传给data。

    11210

    动态内存管理基础详解

    malloc申请的内存空间,当程序退出时,还给操作系统,当程序不退出,动态生气的内存是不会主动释放的,需要用free函数来释放。...每当free函数释放空间后,指针就没有被指向的内容,为了防止野指针,需要将其设为控制在(即每次使用free函数后,都需要置成空指针) free函数不能释放非动态开辟的内存空间,这种行为是标准未定义的 如果...(3)、释放旧的空间 (4)、返回新空间的起始地址 疑问:那realloc的返回值用原有的指针接受吗?...回答:不能,因为假如realloc增容失败,会返回空指针,而原有的指针指向的空间还没有释放,就被置成空指针,这就造成了内存泄露!...malloc/calloc/realloc返回值是否为空 3.2、对动态开辟空间的越界访问 3.3、对非动态开辟的内存进行free释放 3.4、使用free释放一块动态开辟内存的一部分 注意此时的p指向的不是我们动态开辟空间的起始地址

    9610

    C语言---动态内存管理

    //因为malloc返回值是void*类型的指针,所以我们就强制类型转换我们期望类型的指针就行了 //这个时候p就指向了这40个字节 //我们需要进行判断,判断是否开辟成功...1.动态内存的大小是可以调节的 2.开辟空间的位置不一样 */ 这个函数向内存申请⼀块连续可⽤的空间,并返回指向这块空间的指针。 • 如果开辟成功,则返回⼀个指向开辟好空间的指针。...//因为malloc返回值是void*类型的指针,所以我们就强制类型转换我们期望类型的指针就行了 //这个时候p就指向了这40个字节 //我们需要进行判断,判断是否开辟成功...对于情况二的话:1.后续空间不够的话,realloc函数直接在内存堆区开辟一个新的20个字节满足大小的空间 2.将旧的数据拷贝到新的空间 3.realloc函数会讲旧的空间释放,旧的空间就用我们释放了...,realloc帮我们释放 总之: realloc函数返回的地址可能是一个旧的地址,也可能是一个新的地址,也可能是一个空指针 那么我们应该拿什么东西进行指针接收呢?

    9210

    C语言动态内存开辟

    ,并返回指向这块空间的指针。...free之后,指向的将内存空间被释放了还给操作系统,但是p依然有能力找到这快空间, p = NULL,主动将p赋值给空指针,彻底断开了联系,很好的避免了它犯错误。...free函数用来释放动态开辟的内存 如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的。 如果参数prt是NULL指针,咋函数什么事都不做。...,还会将原来内存中的数据移动到新的空间 realloc在调整内存空间存在两种情况 注意事项: 如果p指向的空间之后有足够的内存空间可以追加,则直接追加,后返回p指向空间的地址。...如果p指向的空间之后没有足够的内存空间可以追加,则realloc函数会重新找一块新的内存区域,开辟一块满足需求的空间并且把原来内存中的数据拷贝回来,释放旧的内存空间。最后返回新开辟的内存空间地址。

    57110

    动态内存管理

    2.动态内存函数的介绍 2.1 malloc和free C语言提供了一个动态内存开辟的函数: void* malloc (size_t size); 这个函数向内存申请一块 连续可用 的空间,并返回指向这块空间的指针...如果开辟成功,则返回一个指向开辟好空间的指针。 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。...如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。 如果参数 ptr 是NULL指针,则函数什么事都不做。...这样函数会把旧的空间的数据拷贝到新的空间的前面的位置,并把旧的空间释放,返回的是一个新的内存地址。 由于上述的两种情况, realloc 函数的使用就要注意一些。...栈区( stack ):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结 束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是 分配的内存容量有限。

    10410

    C语言动态内存管理函数

    一、内存划分 以下为C程序运行时,内存的划分图: 二、malloc函数 该函数为C语言的动态内存开辟函数 void* malloc(size_t size); 注意事项: 开辟成功,返回一个指针,指向开辟好的空间...四、realloc函数 该函数为C语言的对动态开辟内存大小的调整的函数 void* realloc(void* ptr, size_t size); 注意事项: 指针ptr指向的内存空间后,有足够的空间可以扩容...,直接在后边续上新的空间,返回旧的起始地址; 当后边没有足够的空间扩容时,realloc会找一个满足空间大小的新的连续的空间。...把旧的空间的数据,拷贝新空间的前面的位置,并且把旧的空间释放掉,返回新的空间的地址。 realloc扩容失败时,返回NULL。...五、free函数 专门做动态内存的释放和回收 void free(void* ptr); 注意:         ptr是指向一片连续的堆区的内存空间。

    17020

    练习使用动态内存相关的4个函数:malloc、calloc、realloc、free

    如果开辟成功,返回一个开辟成功的指针。 如果失败,则返回NULL。因此,在malloc使用之前必须检查是否为空指针。 返回类型为void*,因此,返回的类型由自己来决定。...realloc 有时会我们发现过去申请的空间太⼩了,有时候我们⼜会觉得申请的空间过⼤了,那为了合理的时 候内存,我们⼀定会对内存的⼤⼩做灵活的调整。...(满足新的大小要求)会将原来的数据拷贝一份到新的空间,释放旧的空间(realloc会主动把这块空间释放掉)。这样函数返回的是⼀个新的内存地址。 还有一种情况,调整失败,返回的是空指针。...不用也不释放,就造成了内存泄漏的问题。 malloc,realloc,calloc申请的空间如果不想使用,都可以使用free来释放,当程序结束的时候,也会由操作系统释放。...空指针没有指向有效的空间, 当结束最上面一个程序运行的时候,str的空间已经还给操作系统了,str已经是空指针了。出现对空指针的解引用操作,程序崩溃,不会打印。

    14710

    动态内存分配

    C语言存在动态内存分配的主要原因是为了灵活地管理内存资源。动态内存分配允许程序在运行时根据需要申请和释放内存,以满足不同的需求。...的行为是标准未定义的,取决于编译器 C语言提供了另外一个函数free,专门用来做动态内存的释放和回收,函数原型如下: void free(void* ptr) 如果参数ptr指向的空间不是动态开辟的,那...void *realloc( void *ptr, size_t size ); 其中,第一个参数 ptr 是指向已经分配内存的指针,如果它为 NULL,则 realloc() 的作用相当于 malloc...realloc的返回值也是一个指针,指向的是重新调整之后的内存块.realloc调整空间时有两种做法:1.如果后面的空间足够,则会返回旧的地址。...2.如果后面的空间不足,该函数会重新申请一块新的地址,把原空间的内容拷贝下来,把原来的旧空间释放掉,最后返回新的地址。

    12210

    【C语言】动态内存管理:malloc、calloc、realloc、free

    void* malloc(size_t size); //size的单位是字节 这个函数向内存申请一块连续可用的空间,并返回指向这款空间的指针。 如果开辟成功,则返回一个指向开辟好空间的指针。...void free(void* ptr); free函数用来释放动态开辟内存。ptr传的是要释放的内存空间的起始地址。 如果参数ptr指向的空间不是动态开辟的,那么free的行为是未定义的。...情况二 :         1.在内存里重新找一块区域,这块区域直接满足40个字节的需求。         2.把原来的内容都拷贝在这个新内存里。         3.释放旧空间。...= NULL) //判断是否成功 { p0 = newptr; //成功了再用原来的指针接管扩容后的空间 } else //失败 { perror("realloc fail"); //....{ return; } for (i = 0; i <= 10; i++) { *(p + i) = i; //当i为10时越界访问 } free(p); p = NULL;

    57710

    【C进阶】——动态内存管理详解 及 经典笔试题解析

    所以对于calloc 的返回值,我们也有必要做一下检查,判断是否为空指针。...这时候: realloc会在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址,不再指向原空间。 而且: realloc会将原空间的数据拷贝到新空间,并会将旧空间释放掉。...然后返回指向该内存块起始地址的指针。 还要一点需要注意: 我们要知道realloc的第一个参数void* ptr 也可以接收一个空指针,当它接收的是空指针的时候,就相当于malloc了。...3.1 对NULL指针的解引用操作 通过上面的学习我们已经知道了,malloc,realloc,calloc在开辟空间时,一旦开辟失败,就会返回空指针,如果我们不小心对这些空指针进行了解引用,就会导致错误的发生...这样的代码运行,可能是会出错的。 所以我们不要用free去释放非动态开辟的内存。 3.4 使用free释放一块动态开辟内存的一部分 什么意思呢?

    17510
    领券