malloc,new是不是都是通过VirtualAlloc实现的?

JeanLove 2010-12-03 08:34:33
我发现malloc得到的内存指针不可以通过GlobalHandle来得到句柄, 返回结果还是指针的值。
下面这几行代码


int main(int argc, char* argv[])
{
char* p1=(char*)malloc(2);
HANDLE hMem=GlobalHandle(p1);
if(NULL==hMem)printf("error:%d\n",GetLastError());
else printf("hMem=%d\n",hMem);
printf("p1=%d,新指针=%d\n",(UINT)GlobalLock(hMem));
return 0;
}


运行的结果是:
hMem=4398480
p1=4398480,新指针=2105145884
Press any key to continue

我发现,这个hMem和p1的值是相等的,但是接下来GlobalLock(hMem)却可以返回一个新的指针的值。那么这个新的指针的值又代表了什么内容呢?
为什么和p1不相等?
...全文
109 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
blpluto 2010-12-03
  • 打赏
  • 举报
回复
前几天刚回了这帖子~~LZ去搜下吧
m_tornado 2010-12-03
  • 打赏
  • 举报
回复

前两天有个类似帖子,说HeapAlloc VirtualAlloc区别的,可以搜索看~
cranium 2010-12-03
  • 打赏
  • 举报
回复
new不是很清楚,相信也和malloc一样,具体做法依赖于库的实现。

不过最终都是通过系统调用实现的,他们通过适当封装实现了简单的接口。

unix下听闻进程只有一个堆,但windows不同,windows下的程序运行时有很多堆。有系统分配的也有程序员主动分配的。

Global*函数时早期windows系统的遗留产物吧,它们出现时windows的内存结构和现在的不同,虽然现在保留了这些函数以兼容早期代码,但是意义却变化了,现在的Global*操作的堆是应用程序堆,不再有全局和局部堆之分。

一个程序除了有个应用程序堆,如果还是用crt,那么crt还会为自己创建一个名称为_crtheap的堆,它用于crt的内存分配。所以通过malloc分配的内存实际是在_crtheap中分配的,你通过访问应用程序堆的函数无法获得_crt堆中的内存。

一个广泛的问题就是:dll分配内存需要在本dll中释放,不然就可能出错。因为有可能有些dll静态链接了crt库,导致程序里出现多个crt堆。不同堆内存不能互相操作。

阿呆_ 2010-12-03
  • 打赏
  • 举报
回复
malloc和new是通过HeapAlloc来分配的, HeapAlloc分配的是当前进程中Heap管理器管理的内存,这部分内存是进程初始化(或者现有Heap不够用)时通过VirtualAlloc分配的多页虚拟内存

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧