C++ new[] 实际申请内存
来源:互联网 发布:伏安特性曲线实验数据 编辑:程序博客网 时间:2024/06/03 21:30
c++ 中使用new动态生成数组时,实际申请内存是否与期望值一样?如下面代码所示new int[count]申请内存是否等于len?
const int count = 10;const int len = sizeof(int) * count;int *array = new int[count];
编写测试代码如下。
#define TRACE(fmt, args...) printf("%s:%d " fmt, __FUNCTION__, __LINE__, ##args)class test{ public: test(){printf("constructing test\n");}; ~test(){printf("destructing test\n");}; void *operator new[](size_t num){ TRACE("new[%d]\n", num); return ::new char[num]; }; void operator delete[](void *ptr){ TRACE("delete[0X%X]\n", ptr); ::delete []ptr; };};int main(int argc, char **argv){ TRACE("sizeof class test: %d\n", sizeof(test)); test *pt = new test[8]; TRACE("address of pt: 0x%x\n", pt); delete []pt; return 0;}
现在执行程序,得到如下打印
main:61 sizeof class test: 1operator new []:50 new[12] //实际申请多4个字节constructing testconstructing testconstructing testconstructing testconstructing testconstructing testconstructing testconstructing testmain:64 address of pt: 0x952900c //申请得到的地址destructing testdestructing testdestructing testdestructing testdestructing testdestructing testdestructing testdestructing testoperator delete []:54 delete[0X9529008] //申请与释放的地址不同
可以看到实际申请的内存比期望值多了4byte,同时可以注意到释放的地址=pt-4。那么这多申请的内存用在何处。接下来使用GDB调试,并在delete []pt;行打入断点。
gdb ./all(gdb) break 66Breakpoint 1 at 0x8048709: file main.cpp, line 66.
接下来我们执行程序,并打印pt指针的值,以及附近内存。
main:61 sizeof class test: 1operator new []:50 new[12]constructing testconstructing testconstructing testconstructing testconstructing testconstructing testconstructing testconstructing testmain:64 address of pt: 0x804b00cBreakpoint 1, main (argc=1, argv=0xbffff384) at main.cpp:6666 delete []pt;(gdb) p pt$3 = (test *) 0x804b00c(gdb) x/8xw 0X804B0080x804b008: 0x00000008 0x00000000 0x00000000 0x00020ff10x804b018: 0x00000000 0x00000000 0x00000000 0x00000000
可以看到在地址0x804b008,存放了一个数值8;也就是new test[8]中数组的大小。
其内存布局可以可以如下图所示。
阅读全文
0 0
- C++ new[] 实际申请内存
- C++new申请内存后的判断和assert()
- new与delete申请内存
- C内存申请函数
- c 局部申请内存
- C内存申请释放
- C指针申请内存
- C语言申请内存
- C申请内存函数
- new、delete、指向连续空间的指针、数组、空间释放、空间申请[C++][内存管理]
- new、delete、指向连续空间的指针、数组、空间释放、空间申请[C++][内存管理]
- new malloc 内存申请转储
- 判断用new申请内存是否成功
- 动态内存申请 new、delete、delete[]、delete()
- C 内存申请和释放
- C语言动态内存申请
- C/C++ - 结构体实际申请的空间
- malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存
- linux常用命令
- MySQL日志文件的开启与参数详解
- 毕业后五年,你会在哪里…
- 关键字之运算符
- C 提高之变量和指针
- C++ new[] 实际申请内存
- 【工具】Anaconda版本管理
- 2017年6月4日22:08:33 238. Product of Array Except Self 【medium】
- 21条css高级技巧
- Java swing setEnable()”方法的使用
- 【NGUI基础知识】——UIGrid(网格排列)
- caffe训练与微调时的区别
- MFC与duilib之间控件相互调用
- 欢迎使用CSDN-markdown编辑器