new分配的内存一定在堆上么?

来源:互联网 发布:微云同步盘for mac 编辑:程序博客网 时间:2024/05/16 14:42

运行环境在 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个地址。







0 0
原创粉丝点击