运行环境在 Ubuntu 14:05 上
#include <iostream>
#include <stdio.h>
#include <unistd.h>
int main (void) {
int *A = new int(100);
printf("%p\n",A);
printf("请查看/proc/%u/maps,按回车结束....",getpid());
getchar ();
return 0;
}
在打印出进程PID的同时可以查看A地址,之后查看maps文件内容确定 new分配的内存一定在堆上!
在这里我先解释一下,程序在内存中的分布情况。
从低地址到高地址:
代码区: 包含字面值常量,执行指令,函数地址,含有常属性且初始化的全局和静态局部变量。(只读)
数据区: 不含有常属性且初始化的全局和静态局部变量
BSS: 不含有常属性且不初始化的全局和静态局部变量
堆: 动态内存分配。从低地址到高地址扩散.
注: 中间保存动态库或者静态库,为堆栈预留空间。
栈: 非静态局部变量,函数形式参数和返回值.从高地址到低地址扩散.
命令行参数与环境区: 命令行参数和环境变量。
BSS和数据区统称为 全局区或静态区。
从图像中可以明显的看出new分配出来的内存存放在堆中。
在拓展一点 :
#include <stdio.h>
#include <iostream>
using namespace std;
int main (void) {
char buf[100];
int num = 100;
char *pc = new(buf) char [10];
printf("pc:\t%p\nbuf:\t%p\n",pc,buf);
return 0;
}
这个代码是为了证明,栈上的空间也可以给new分配的内存。
但是真能是我想的那样,能分出很多么
#include <stdio.h>
#include <iostream>
using namespace std;
int main (void) {
char buf[100];
int num = 100;
char *pc = new(buf) char [200];
printf("pc:\t%p\nbuf:\t%p\n",pc,buf);
printf("num:\t%p\n",&num);
return 0;
}
这个为了证明,虽然我想分配200个字节,但是现在buf没有那么大,所以最后输出的他只分配了100个地址。