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

运行环境在 Ubuntu 14:05 上

#include 

#include 

#include 

int main (void) {

	int *A = new int(100);

	printf("%p\n",A);

	printf("请查看/proc/%u/maps,按回车结束....",getpid());

	getchar ();
	
	return 0;

}

在打印出进程PID的同时可以查看A地址,之后查看maps文件内容确定 new分配的内存一定在堆上!

new分配的内存一定在堆上么?_第1张图片

new分配的内存一定在堆上么?_第2张图片

在这里我先解释一下,程序在内存中的分布情况。

从低地址到高地址:

代码区: 包含字面值常量,执行指令,函数地址,含有常属性且初始化的全局和静态局部变量。(只读)

数据区: 不含有常属性且初始化的全局和静态局部变量

BSS: 不含有常属性且不初始化的全局和静态局部变量

堆: 动态内存分配。从低地址到高地址扩散.

注: 中间保存动态库或者静态库,为堆栈预留空间。

栈: 非静态局部变量,函数形式参数和返回值.从高地址到低地址扩散.

命令行参数与环境区: 命令行参数和环境变量。

BSS和数据区统称为 全局区或静态区。


从图像中可以明显的看出new分配出来的内存存放在堆中。

在拓展一点 :

#include 
#include 
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 
#include 
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个地址。







你可能感兴趣的:(c,c++)