赞
踩
malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
void* 类型表示未确定类型的指针。C,C++规定,void* 类型可以通过类型转换强制转换为任何其它类型的指针。一般需和free函数配对使用。但是,malloc最多能分配多大的空间呢?
- #include <iostream>
- #include <stdio.h>
- #include <stdlib.h>
-
- using namespace std;
-
- int main(int argc, char** argv)
- {
- size_t maximum = 0;
- size_t blocksize[] = { 1024 * 1024, 1024, 1};
- for (int i = 0; i < 3; i++)
- {
- maximum = 0;
- for (int count = 1; ; ++count)
- {
- void* block = malloc(maximum + blocksize[i] * count);
- if (block)
- {
- maximum = maximum + blocksize[i] * count;
- free(block);
- }
- else
- {
- break;
- }
- }
- }
-
- std::cout << "maxmium malloc size = " << maximum / 1000000000.0 << "G" << std::endl;
-
- return 0;
- }
地址空间限制是有的,但是malloc通常情况下申请到的空间达不到地址空间上限。内存碎片会影响到你“一次”申请到的最大内存空间。比如你有10M空间,申请两次2M,一次1M,一次5M没有问题。但如果你申请两次2M,一次4M,一次1M,释放4M,那么剩下的空间虽然够5M,但是由于已经不是连续的内存区域,malloc也会失败。系统也会限制你的程序使用malloc申请到的最大内存。Windows下32位程序如果单纯看地址空间能有4G左右的内存可用,不过实际上系统会把其中2G的地址留给内核使用,所以你的程序最大能用2G的内存。除去其他开销,你能用malloc申请到的内存只有1.9G左右。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。