windows C++ new/delete内存大小
转载自:https://blog.csdn.net/will_hsbsch/article/details/21124055
windows 上,但使用C++语言new一块内存,用指针P指向这块内存,但我们调用delete的时候如何知道我们需要释放的空间大小,毕竟我们只给了一个P指针,并没有给出内存大小。
在Windows系统上,每当使用new/new[]申请到内存时,回调用系统的API在堆上开出一块我们需要大小的内存。例如:
int* p = new int[100];
此时申请成功时,P指向了这块内存的一个元素地址。同时,会在P的前面,记录我们申请的内存大小,这样当我们调用delete []p时,系统才知道我们具体申请的内存大小。
以下就是P指针地址前面存储我们申请内存信息的结构体:
//typedef struct _RTL_HEAP_ENTRY {
// SIZE_T Size;
// USHORT Flags;
// USHORT AllocatorBackTraceIndex;
// union {
// struct {
// SIZE_T Settable;
// ULONG Tag;
// } s1;
// struct {
// SIZE_T CommittedSize;
// PVOID FirstBlock;
// } s2;
// } u;
//} RTL_HEAP_ENTRY, *PRTL_HEAP_ENTRY;
用下面代码查看具体的存储信息
// int *p = new int[100];
// PRTL_HEAP_ENTRY pHeapEntry=(PRTL_HEAP_ENTRY(p)-1);
// printf("i: %d, size: %d\n", i, pHeapEntry->Size); 以上代码就是通过指针获取内存大小,具体多少字节。 Size存的是字节数
也可以进行估算,Size 4个字节, Flags 4个字节, union(Settable 4个字节, Tag 4个字节), 所以Size地址与new地址相差16个字节
实验例子:
1.
int *p = new int;
cout << *(p - ) << endl; //
2.
int *p = new int[];
cout << *(p - ) << endl; //
3.
char *p = new char[];
cout << *(int*)(p - ) << endl; //
4.
我们把P向后移动一个位置或者向前,只要不是这块内存的第一个位置,然后我们delete[] p,会有什么后果?后果不可预测!!自己实验下,系统卡死,死循环
windows C++ new/delete内存大小的更多相关文章
- Linux 下修改Tomcat使用的JVM内存大小
我的服务器的配置: # OS specific support. $var _must_ be set to either true or false. JAVA_OPTS="-Xms10 ...
- 修改Tomcat使用的JVM内存大小
我的服务器的配置: # OS specific support. $var _must_ be set to either true or false. JAVA_OPTS="-Xms10 ...
- Tomcat 设置JVM内存大小
我的服务器的配置: # OS specific support. $var _must_ be set to either true or false. JAVA_OPTS="-Xms10 ...
- [转帖] Windows 与linux的栈大小问题
一般来说,我们所用的内存有栈和堆之分,其它的我们很少控制,栈的速度快,但是空间小.不灵活:而堆的空间几乎可以满足任何要求.灵活,但是相对的速度要慢了很多,并且在VC中堆是人为控制的,new了就要del ...
- C++类所占内存大小计算
C++类所占内存大小计算 说明:笔者的操作系统是32位的. class A {}; sizeof( A ) = ? sizeof( A ) = 1明明是空类,为什么编译器说它是1呢? 空类同样可以实例 ...
- 设置TOMCAT的JVM虚拟机内存大小
你知道如何设置TOMCAT的JVM虚拟机内存大小吗,这里和大家分享一下,JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序.这个初始内存和最大内存在一定程度都会影响程序的性能. 设置 ...
- TOMCAT内存大小调整
Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机.JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序.这个初始内存和最大内存在一定程度都会 ...
- 修改Tomcat内存大小
Windows下,在文件/bin/catalina.bat,Linux下,在文件/bin/catalina.sh的前面,增加如下设置: JAVA_OPTS=-Xms[初始化内存大小] -Xmx[可以使 ...
- tomcat绿色版及安装版修改内存大小的方法
1.对于安装版,比较方便了,直接运行tomcat6w.exe,选择Java选项卡, 在这里,可以设置初始化内存,最大内存,线程的内存大小. 初始化内存:如果机器的内存足够大,可以直接将初始化内存设置为 ...
随机推荐
- 【11】Redis .net 实例 StackExchange.Redis框架
1.创建测试项目并下载nuget包:StackExchange.Redis PM> Install-Package StackExchange.Redis 2.创建 RedisHelper类 p ...
- django中的缓存
对于一个动态网站来说,用户的每次访问都意味着对服务器的一次开销,当该服务器的并发访问非常大时,对于一个动态网站来说,开销会非常的大.所以对于大中型web应用来说,减轻服务器的性能瓶颈就很有必要 对于d ...
- groovy运算符
import java.util.regex.Matcher /** * Created by Jxy on 2018/12/20 10:29 * groovy运算符 */ /*class opera ...
- 关系型数据库——主键&外键的
一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学 ...
- Nodejs + express + ejs 之服务器demo
var http=require("http"); var express=require("express"); var fs = require(" ...
- Android学习笔记(3)----手机调试[OFFLINE]的解决方式
问题描述 今天用Android Studio开发了一个简单的调用摄像头的App,结果想调试的时候发现选择调试设备的对话框中,手机名称后面总是跟着一个[OFFLINE]的标识,只能选择启动AVD来进行调 ...
- How to save rules of the iptables?
The easy way is to use iptables-persistent. Install iptables-persistent: sudo apt-get install iptabl ...
- 【眼见为实】自己动手实践理解数据库REPEATABLE READ && Next-Key Lock
[REPEATABLE READ] 首先设置数据库隔离级别为可重复读(REPEATABLE READ): set global transaction isolation level REPEATAB ...
- Java基础之StringBuffer和StringBuilder的区别
StringBuffer是一个字符串的缓存类,属于一个容器,对于容器,我们可以进行增删改查. StringBuffer的容器长度是可变的,并且里面可以存放多种的数据类型.它跟其他容器,比如数组,是很不 ...
- Protocol Buffer学习笔记
Protocol Buffer Protobuf基础概念 Protobuf是google开发的数据结构描述语言,能够将结构化数据序列化与反序列化,取代json和xml,常用于服务器通信协议.RPC系统 ...