C++中指针的内存申请与释放问题
来源:互联网 发布:mysql进入命令行 编辑:程序博客网 时间:2024/06/01 09:56
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++中指针的内存申请与释放问题
- c++中指针的内存申请和内存释放问题
- c++中指针的内存申请和内存释放问题
- C语言中 内存的申请与释放
- 结构体包含二级指针和二级指针内存的申请与释放问题
- c/c++多级指针的内存申请和释放
- C语言动态内存的申请与释放及野指针
- C指针(一) - 申请和释放内存
- C指针(一) - 申请和释放内存
- 【C/C++开发】C语言 DLL(动态链接库)中申请动态内存释放的问题
- 内存的申请与释放
- 内存的申请与释放
- 内存资源的申请与释放(C&C++)
- c++/c内存申请与释放
- c语言中动态内存申请与释放的简单理解
- 关于在dll中申请内存,外部释放的问题
- 关于在dll中申请内存,外部释放的问题
- 关于在dll中申请内存,外部释放的问题
- Assembly language Start
- jQuery插件flexigrid研究, 为搜索项设置匹配操作符
- spring+struts2+hibernate 最精简jar包引用
- Oracle RAC安装[VMWare+Redhat AS4+裸磁盘]
- Oracle RAC安装[VMWare+Redhat AS4+裸磁盘]
- C++中指针的内存申请与释放问题
- Android中监听网络状态
- 关于WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解(个人认为还是相当全面的)
- 分布式 部署 ArcSDE 和 Oracle 服务(附64位Oracle下安装32位ArcSDE)(from GIS广益的空间)
- windows程序设计「BITMASK.C」范例分析笔记
- 正则表达式 匹配
- 短信猫软件的实现(C#)系列文章索引
- Struts2 + Spring 整合简单例子(转)
- 93450C光驱刷机