c++指针存储应用程序和释放内存的问题
C++中指针在new和delete操作的时候对内存堆都做了些什么呢。下面解:
1、指针的new操作:
指针在new之后,会在内存堆中分配一个空间。而指针中存放的是这个空间的地址。如:
void main(){
int *p = new int(4);
cout << p << endl;
cout << *p << endl;
}
输出为:
0x00431BF0
4
分别为分配的空间地址和地址内存放的值。
假设写为:
void main(){
int *p = new int(4);
cout << *(int *)0x00431BF0 << endl;
}
输出为:4
程序的意思就是将0x00431BF0内存地址開始的4个byte的块取出转换为int类型输出。即直接读取内存。
2、指针的delete操作:
指针在delete的时候。会将指针指向的内存区域释放掉,而指针同内存区域的联系并没有被切断,仍然会仅仅想原来指向的内存区域。如:
void main(){
int *p = new int(4);
cout << p << endl;
cout << *p << endl;
delete p;
cout << p << endl;
cout << *p << endl;
}
程序输出:
0x00431BF0
4
0x00431BF0
-572662307
能够看到p前后指向的地址是同样的,而指向地址的内存区域被释放。
3、空指针:
空指针指向的内存区域为内存的首地址,是不可读写的区域,即空指针不提供操作。删除空指针是安全的(由于它什么也没做)。所以,在写构造函数,
赋值操作符。或其它成员函数时,类的每一个指针成员要么指向有效的内存,要么就指向空,那在你的析构函数里你就能够仅仅用简单地delete 掉他们。而不用
操心他们是不是被new 过。如:
void main(){
int *p = NULL;
cout << p << endl;
} //输出0x00000000
4、取出内存区域的值
在取某内存地址開始的一个区域的值的时候,取出的值取决于用来取值的类型,譬如int为4个byte。char为1个byte。程序如:
void main(){
int a[2] = {261,0};
int *pi = a;
char *p = (char*)pi;
cout << *(int *)p++ << endl; //取出p地址,转化为取4个byte,并取出内容。之后p向后移动一位
cout << *(int *)p << endl; //取出p地址,转化为取4个byte,并取出内容
cout << (int)*p << endl; //取出1个char类型,并转换为int型
cout << (int)*(char *)pi << endl; //取出pi地址。转换为char类型,取出内容,并转换为int型
}
程序输出:
261
1
1
5
a的存储区域安排为:byte1=5,byte2=1,byte3~byte8 = 0;
所以*(int *)p++取的为byte1到byte4。 之后的*(int *)p取的是byte2到byte5。
(int)*p取的它是byte2;(int)*(char *)pi就拿byte1,在转换到后int类型
版权声明:本文博主原创文章,博客,未经同意不得转载。
c++指针存储应用程序和释放内存的问题的更多相关文章
- 让.NET程序快速释放内存的办法
原文:让.NET程序快速释放内存的办法 公司里的一个程序,经过了N个人的手后发现上了生产内存会一直涨,直到物理内存几乎被占用完毕后突然就下降下来(估计是GC给释放了),然后再一直涨.这个程序主要是对字 ...
- 释放内存触发断点及数组、指针的NULL初始化
Visual Studio调试时,出现“触发一个断点”内存释放出现异常 数组和对应指针的NULL初始化 数组使用之前要先对其初始化 char Outi[4] = { NULL }; char Outj ...
- C++ - free()函数释放内存后的指针行为
一个指针释放后不置空的后果: free(p)之后原本那块内存的数据已经被释放了,内存重新收回.但此时的指针变量依然指向那块内存,在以后的代码中若不小心继续调用指针变量,会出现不可预料的错误. 不置空的 ...
- C++ STL map容器值为指针时怎么释放内存
最近在使用STL中map时,遇到了一个问题,就是当map中值为指针对象时怎么释放内存? // 站点与TCP连接映射表 (key为ip_port_stationCode, value为 clientSo ...
- SDUT OJ 2892 A (字典树问题-输出出现次数最多的字符串的出现次数,60ms卡时间,指针+最后运行完释放内存)
A Time Limit: 60ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 给出n(1<= n && n <= 2*10^6)个字 ...
- [转载]Java应用程序中的内存泄漏及内存管理
近期发现测试的项目中有JAVA内存泄露的现象.虽然JAVA有垃圾回收的机制,但是如果不及时释放引用就会发生内存泄露现象.在实际工作中我们使用Jprofiler调用java自带的 jmap来做检测还是很 ...
- C Primer Plus之存储类、链接和内存管理
存储时期即生存周期——变量在内存中保留的时间 变量的作用域和链接一起表明程序的哪些部分可以通过变量名来使用该变量. 注意:生存期和作用域是两个不同的概念. 作用域 作用域描述了程序中可以访问一个 ...
- C/C++动态分配与释放内存的区别详细解析
以下是对C与C++中动态分配与释放内存的区别进行了详细的分析介绍,需要的朋友可以过来参考下 1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配 ...
- 对于c语言存储分配程序(malloc函数)实现的理解
内容主要出自<The C Programming Language>一书,不得不说这是一本程序员必读的书,我大二读了前面几章就扔到一边了,直到最近才又拿起来再读,找不到言语来形容我现在后悔 ...
随机推荐
- 我已提取并尝试使用启动脚本(./start navicat)来启动 Navicat Linux 版本号,但没有反应
具体的安装教程,參考这个navicat_for_mysql_10.0.11在linux下的安装,介绍的非常具体 參考这个 :我可否在 64-bit Linux 执行 Navicat? 推荐navica ...
- Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖
标题来源:problem=1406">Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路: ...
- Node.js Tools for Visual Studio
https://www.visualstudio.com/en-us/features/node-js-vs.aspx
- 玩转Web之Json(一)-----easy ui+ajax + json 中关于Json的解析问题
在easy ui中使用Ajax+Json实现前后的数据交互时,当后台数据传输到客户端是需对Json数据进行解析,这里将对Json数据解析做简单总结. (一) 对于服务器返回的数据若没有做类型说明,需要 ...
- 赵雅智_BroadcastReceiver短信监听
AndroidManifest.xml 注冊广播接收者 加入权限 <?xml version="1.0" encoding="utf-8"?> &l ...
- Win7设置局域网共享
Win7设置局域网共享 1. 把win7的guest用户开启. 打开win7的控制面板=>用户账号与安全=>用户账户=>管理其他用户=>点击guest用户,进行开启. 2.解决 ...
- 分布式服务框架 dubbo/dubbox 入门示例(转)
dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架. 官网首页:http://dubbo.io/ ,官方用户指南 http://dubbo.io/User+Guide-zh.htm ...
- yate.conf
但档案.粘贴下面的例子.不解释!除去非常灵活!只保留sip电话! [general] ; General settings for the operation of Yate ; modload: b ...
- 经FreeMarkerclasspath加载方式生成静态页面
package htmlskin; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundExc ...
- Storm基础知识
上一篇文章我们介绍一个简单的Storm起源,今天我去学习Storm一些主要的知识,他的基本使用基本的了解.幸运的是,,不是太困难,假设我们理解Hadoop的MapReduce模型的话.看这个也是很类似 ...