函数原型:函数
(void *) (int size) 工具
函数的返回值为void类型指针,参数为int类型数据,即请求分配的内存大小,单位为字节。 内存分配成功后,函数返回该内存的首地址。 您需要一个指针来接收该地址。 但是因为函数的返回值是void *类型,所以必须强制转换为你接收到的类型。也就是说,以后这块内存会用来存储什么类型的数据,比如操作系统?
char *p = (char *)(100);.net
在堆上分配100字节内存,返回这块内存的首地址,将该地址强制转换为char *类型,并赋值给char *类型的指针变量p; 同时告诉我们这块内存将用于存储char类型数据。 也就是说,你只能通过指针变量p来操作这块内存。这块内存没有名字,对其的访问被设计为匿名的。
使用函数时还应该注意这一点:如果请求的内存块大于堆上当前剩余的内存块(整个块),则内存分配将失败,函数将为NULL。 注意,这里所说的“堆上剩余内存块”并不是所有剩余内存块的总和,因为该函数申请的是一块连续的内存。 由于函数申请内存可能不会成功,所以当我们使用指向这块内存的指针时,必须使用if(NULL != p)语句来验证内存分配确实成功。
内存泄漏博客
在C语言编程中,内存泄漏几乎是不可避免的。 如果C程序发生内存泄漏,其运行速度会逐渐减慢,最终停止运行; 如果覆盖内存,程序将变得非常脆弱,很容易受到恶意用户的攻击。 内存泄漏是一个隐藏的危险。 它们很难被发现。 一般情况下,在相应的源代码中是找不到错误的。 需要仔细的分析和特殊的检测工具才能找到它们。内存
(1)内存泄漏的定义资源
一般来说,我们所说的内存泄漏是指分配的内存在使用后没有被释放或回收。 随着时间的推移,将没有足够的内存来分配。 通常,运行时间越长,占用的内存就越多,最终导致系统崩溃。 常见的内存泄漏是指堆内存泄漏。 堆内存是指程序从堆中分配的内存,任意大小(内存块的大小可以在程序运行时确定),并且使用后必须显式释放。 应用程序通常使用new等函数从堆中分配一块内存。 使用完毕后,程序必须负责相应地调用free或释放该内存块。 否则,该内存将无法再次使用。 我们将此块称为“内存泄漏”。 得到
(2)内存泄漏的原因
2.1 C语言内存分配状态
在C语言中,根据数据在内存中存在的时间(生命周期)将内存空间分为三个区域:
1)程序区:用于存储程序代码,即程序的二进制代码。
2)静态存储区:用于存储全局变量和静态变量。 这些变量的空间在程序编译时就已分配。
3)动态存储区:用于程序执行过程中分配的内存,分为:堆区(heap)和栈区(stack)。 堆区:用于动态内存分配。 内存分配函数在程序运行时在堆上分配内存。 在C语言中,只能使用指针来动态分配内存。 栈区:函数执行时,函数内部用于局部变量和函数参数的存储单元的内存区域。 当函数结束时,这些内存区域会自动释放。
2.2 C语言动态内存分配
在C语言中,利用内存分配函数来实现内存的动态分配。 这些函数包括: () 和 () 函数。 ():使用该函数时需要包含头文件。 要使用该函数,需要指定要分配的内存字节数作为参数,例如:
整数*=(整数*)(100)
该语句分配100字节的内存并分配该内存块的地址。 该内存块最多可以存储25个int值,每个int占用4个字节。 如果无法分配所请求的内存,()将返回空指针。
2.3 释放动态分配的内存
堆上分配的内存会在整个应用程序结束后被操作系统回收,但最好在使用完内存后立即释放。 如果不释放,就会出现内存泄漏,系统资源被大量占用,还可能出现各种未知的错误。 因此必须使用free()函数来释放内存。 参数为内存地址(指针),例如:free(),如上例。
(3)避免内存泄漏的方法
3.1 正确使用函数分配内存
是专门用于从堆中分配内存的函数。 使用该函数有几个要求: 内存分配给谁? 要分配多少内存? 是否分配了足够的内存? 内存将以什么格式存储数据? 分配的内存在哪里? 如果这5点都是正数,那么就可以分配内存了。 看一下下面的原型: (void *) (int size)
函数的返回值为void类型指针,参数为int类型数据,即请求分配的内存大小,单位为字节。 内存分配成功后,函数返回该内存的首地址。 您需要一个指针来接收该地址。 也就是说,这块内存将来会用来存储什么类型的数据,比如:
字符 *p = (字符 *) (100)
在堆内存中分配100字节内存,返回这块内存的首地址,强制该地址为char *类型,并赋值给char *类型的指针变量p; 同时告诉我们这块内存将用来存储char类型的数据。 只能通过指针变量p来操作这块内存。 该内存本身没有名称,对其的访问也是匿名的。 然而,该函数不一定每次都能成功分配内存。 由于函数有可能申请内存不成功,所以当我们使用指向这块内存的指针时,必须使用if(NULL != p)语句来验证内存分配确实成功。
3.2 正确使用free函数释放内存
既然有分配,就必须有释放,否则有限的内存就会被用完,而没有释放的内存就会占用空间,对应的free函数就是。 free函数只有一个参数,就是要释放的内存块的首地址(指针)。 根据上面的例子,就是:free(p)。 free函数实际上做了一件事:切断指针变量和这块内存之间的对应关系。 free函数切断了这块内存和p的关系; p本身的值没有改变或者消失,即指针变量p本身保存的地址没有改变,释放的内存中保存的值也没有改变。 改变。 这就是free函数的作用。 一对应一自由,即一夫一妻制。 使用free(p)函数释放内存后,指针变量p本身保存的地址并没有改变,所以我们必须将p的值改为NULL:p = NULL。 如果指针不设置为NULL,那么指针就变成了“悬空指针”,这是非常危险的,经常会出错。