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
- new分配的内存一定在堆上么?
- new在局部函数中分配的动态内存
- _msize() 返回 new 分配内存的大小
- new分配内存的详细解释
- 安全的使用new分配内存
- new分配内存
- C++内存分配new
- C++ new内存分配
- new内存分配失败
- java new 内存分配
- 类和动态内存分配,类成员的动态内存分配,new,delete,定位new
- placement new 在一块已分配内存上创建对象
- placement new 在一块已分配内存上创建对象
- placement new 在一块已分配内存上创建对象
- placement new 在一块已分配内存上创建对象
- 内存分配:new的三种方法-new expression、operator new和placement new
- C++中的内存分配new()
- 动态内存分配 new,delete
- iOS-生成Bundle包-引入bundle-使用bundle
- 资源共享好网站
- 横竖屏切换时,禁止activity重新创建
- JSON的方法-stringify()
- [POJ2152]消防站解题报告
- new分配的内存一定在堆上么?
- 脚本自动登陆shell脚本(简洁版)
- Win7下Apahce 2.2 + php5.4的curl打开方式
- JavaScript - 轮播广告实例
- java double不使用科学计数法
- objective-c 算数函数
- server/client示例日记
- Android程序:使用ViewFlipper实现屏幕切换动画及手势滑动切换功能
- C编译器剖析_6.3.1 汇编代码生成_由中间指令产生汇编代码的主要流程