上海网站托管,百度app内打开,网络舆情处理公司,建设p2p网站很多地方都会使用内存#xff0c;内存使用过程中操作不当就容易崩溃#xff0c;无法运行程序#xff0c;上网Google学习一下#xff0c;了解整理下他们之间的区别以及使用 #xff0c;获益匪浅 0x01 各自的定义和理解 (1)先看GlobalAlloc() GlobalAlloc()主要用于Win32应用… 很多地方都会使用内存内存使用过程中操作不当就容易崩溃无法运行程序上网Google学习一下了解整理下他们之间的区别以及使用 获益匪浅 0x01 各自的定义和理解 (1)先看GlobalAlloc() GlobalAlloc()主要用于Win32应用程序实现从全局堆中分配出内存供2017-03-05程序使用是16位WINDOWS程序使用的API对应于系统的全局栈返回一个内存句柄在实际需要使用时用GlobalLock()来实际得到内存 区。但32位WINDOWS系统中全局栈和局部堆的区别已经不存在了因此不推荐在Win32中使用该函数应使用新的内存分配函数HeapAlloc()以得到更好的支持GlobalAlloc()还可以用主要是为了 兼容。 一般情况下我们在编程的时候给应用程序分配的内存都是可以移动的或者是可以丢弃的这样能使有限的内存资源充分利用所以在某一个时候我们分配的那块 内存的地址是不确定的因为他是可以移动的所以得先锁定那块内存块这儿应用程序需要调用API函数GlobalLock函数来锁定句柄。如下 lpMemGlobalLock(hMem); 这样应用程序才能存取这块内存。所以我们在使用GlobalAllock时通常搭配使用GlobalLock当然在不使用内存时一定记得使用 GlobalUnlock否则被锁定的内存块一直不能被其他变量使用。 GlobalAlloc对应的释放空间的函数为GlobalFree。 (2)HeapAlloc() HeapALloc是从堆上分配一块内存且分配的内存是不可移动的即如果没有连续的空间能满足分配的大小程序不能将其他零散的 空间利用起来从而导致分配失败该分配方法是从一指定地址开始分配而不像GloabalAlloc是从全局堆上分配这个有可能是全局也有可能是 局部 (3)malloc() 是C运行库中的动态内存分配函数主要用于ANSI C程序中是标准库函数。WINDOWS程序基本不再使用这种方法进行内存操作因为它比WINDOWS内存分配函数少了一些特性如整理内存 (4)new 标准C一般使用new语句分配动态的内存空间需要申请数组时可以直接使用new int[3]这样的方式释放该方法申请的内存空间使用对应的delete语句需要释放的内存空间为一个数组则使用delete [] ary;这样的方式。要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问.new在内部调用malloc来分配内存delete在内部调用free来释放内存。 (5) (1) VirtualAlloc 下面是网友的解释 但我个人的理解这个才是内存申请的鼻祖所有的内存的申请都感觉默认调用了它 PVOID VirtualAlloc(PVOID pvAddress, SIZE_T dwSize, DWORD fdwAllocationType, DWORD fdwProtect) VirtualAlloc是Windows提供的API通常用来分配大块的内存。例如如果想在进程A和进程B之间通过共享内存的方式实现通信可以使用该函数这也是较常用的情况。不要用该函数实现通常情况的内存分配。该函数的一个重要特性是可以预定指定地址和大小的虚拟内存空间。例如希望在进程的地址空间中第50MB的地方分配内存那么将参数 50*1024*1024 52428800 传递给pvAddress将需要的内存大小传递给dwSize。如果系统有足够大的闲置区域能满足请求则系统会将该块区域预订下来并返回预订内存的基地址否则返回NULL。 使用VirtualAlloc分配的内存需要使用VirtualFree来释放。 0x02 区别与联系 它们之间的区别主要有以下几点 1、GlobalAlloc()函数在程序的堆中分配一定的内存是Win16的函数对应于系统的全局栈而在Win32中全局栈和局部堆的区别已经不存在了因此不推荐在Win32中使用该函数。 2、malloc()是标准库函数而new则是运算符它们都可以用于申请动态内存。 3、new()实际上调用的是malloc()函数。 4、new运算符除了分配内存还可以调用构造函数但是malloc()函数只负责分配内存。 5、对于非内部数据类型的对象而言只使用malloc()函数将无法满足动态对象的要求因为malloc()函数不能完成执行构造函数的任务。 6、malloc(); 和 HeapAlloc(); 都是从堆中分配相应的内存不同的是一个是c run time的函数一个是windows系统的函数 对于windows程序来说使用HeapAlloc();会比malloc();效率稍稍高一些。 0x03关于内存的初始化和使用 1、内存分配方式 内存分配方式有三种 1从静态存储区域分配。内存在程序编译的时候就已经分配好这块内存在程序的整个运行期间都存在 。例如全局变量static变量。 2在栈上创建。在执行函数时函数内局部变量的存储单元都可以在栈上创建函数执行结束时这些存 储单元自动被释放。栈内存分配运算内置于处理器的指令集中效率很高但是分配的内存容量有限。 3 从堆上分配亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存程序员自 己负责在何时用free或delete释放内存。动态内存的生存期由我们决定使用非常灵活但问题也最多。 2.内存使用错误 发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误通常是在程序运行时才能捕捉到。 而这些错误大多没有明显的症状时隐时现增加了改错的难度。有时用户怒气冲冲地把你找来程序却没有 发生任何问题你一走错误又发作了。 常见的内存错误及其对策如下 * 内存分配未成功却使用了它。 编程新手常犯这种错误因为他们没有意识到内存分配会不成功。常用解决办法是在使用内存之前检查 指针是否为NULL。如果是用malloc或new来申请内存应该用if(pNULL) 或if(p!NULL)进行防错处理。 * 内存分配虽然成功但是尚未初始化就引用它。 犯这种错误主要有两个起因一是没有初始化的观念二是误以为内存的缺省初值全为零导致引用初值 错误例如数组。 内存的缺省初值究竟是什么并没有统一的标准尽管有些时候为零值我们宁可信其无不 可信其有。所以无论用何种方式创建数组都别忘了赋初值即便是赋零值也不可省略不要嫌麻烦。 * 内存分配成功并且已经初始化但操作越过了内存的边界。 例如在使用数组时经常发生下标“多1”或者“少1”的操作。特别是在for循环语句中循环次数很容易搞 错导致数组操作越界。 * 忘记了释放内存造成内存泄露。 含有这种错误的函数每被调用一次就丢失一块内存。刚开始时系统的内存充足你看不到错误。终有一次 程序突然死掉系统出现提示内存耗尽。 动态内存的申请与释放必须配对程序中malloc与free的使用次数一定要相同否则肯定有错误 new/delete同理。 * 释放了内存却继续使用它。 有三种情况 1程序中的对象调用关系过于复杂实在难以搞清楚某个对象究竟是否已经释放了内存此时应该重新 设计数据结构从根本上解决对象管理的混乱局面。 2函数的return语句写错了注意不要返回指向“栈内存”的“指针”或者“引用”因为该内存在函 数体结束时被自动销毁。 3使用free或delete释放了内存后没有将指针设置为NULL。导致产生“野指针”。 【规则1】用malloc或new申请内存之后应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存 【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。 【规则3】避免数组或指针的下标越界特别要当心发生“多1”或者“少1”操作。 【规则4】动态内存的申请与释放必须配对防止内存泄漏。 【规则5】用free或delete释放了内存之后立即将指针设置为NULL防止产生“野指针”。 这些都是我查阅资料的整理 希望会有所帮助转载于:https://www.cnblogs.com/arsense/p/6505690.html