vc++ 如何扩充 内存块?

yanasdf789 2013-07-29 04:20:05
我先定义了一个内存块,当内存块的剩余容量 小于我需要填入的数据大小?我怎样扩充内存块容器的大小?必须要重新申请一块更大的内存吗?

int *data=(int*)malloc(sizeof(int)*4);我申请了一个四个int 大小的内存
但是实际上我要存入6个int 大小?如何扩充改内存块,保证新的内存块内存地址是连续的?
for(int i=0;i<6;i++)
{

memcpy((int*)data+i,m,sizeof(int));
}
...全文
189 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-07-30
  • 打赏
  • 举报
回复
realloc 的实现和分页机制不存在什么直接的关联,分页机制是操作系统操心的事; malloc,realloc 是编译器实现的。 具体说,是编译器,实现C标准库的时候实现的。 分页机制,对于malloc,realloc 是隐藏在背后起作用的机制,具体会如何,和分配到的内存有关系, 如果分配到页面边界,那么连续的内存可能会在两个页面内,而malloc,realloc 是不会花太多心思,在页面管理上的,最多避免极小内存(比如10字节,5字节,2字节),被分配到不同页面,或者管理块(不关分页什么事)和所管理内存起始位置,避免分到不同页面,以免造成页面抖动而已。 malloc,然后realloc 可以充分利用已经分配的内存,只有分配的空间不够,才会重新分配新的内存块,搬迁数据,从而减少数据搬迁几率,增加内存的利用率。 realloc 确实是个好方法。
nbabn 2013-07-30
  • 打赏
  • 举报
回复
这个过程很奇妙,与内存管理机制有关。realloc重新申请的时候,不一定会重新再分配空间的,比喻malloc(n),当n小于一个分页,内存管理也会分配一个内存页,如果relloc(m),这个m还是小于一个分页的话,这个时候是不会再次分配内存的(WIN32下通过WINDBG查看relloc后的虚拟地址对应的物理地址,物理地址不变),如果malloc(n)大于一个分布,relloc之后,可能会发生内存的重新分配,也可能不会,还是与实际的大小和分页大小有关。 realloc函数效率可能比我们想像的要高。
max_min_ 2013-07-29
  • 打赏
  • 举报
回复

int *data=(int*)malloc(sizeof(int)*4);
1 .realloc(&data, sizeof(int)*6); // realloc函数重新分配内存大小
2 .重新分配,话说malloc每次都是一个页面一个页面的分配内存的,即使你申请的比较小的内存,第一次申请也是一个页面(4K的样子),第二次分配只要大小不超过4K,还是在第一次分配的那片内存上的,至于为什么没有连续,是因为每次malloc会额外分配出来一个字节保存对应free结束的标识符!

3 .
ri_aje 2013-07-29
  • 打赏
  • 举报
回复
重新申请,复制数据,释放旧内存。
derekrose 2013-07-29
  • 打赏
  • 举报
回复
placement new
大尾巴猫 2013-07-29
  • 打赏
  • 举报
回复
realloc函数

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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