C++语言中用指针申请内存时产生的问题。
来源:互联网 发布:js 合计不能超过数字 编辑:程序博客网 时间:2024/05/20 20:01
看下面一段程序:
#include<iostream.h>
int main()
{
int *p; //(1)
{
int *tm; //(2)
tm=new int; //(3)
*tm=20; //(4)
p=tm; //(5)
} //(6)
return 0;
}
程序运行到(1)时p=0xcccccccc,*p=error,
程序运行到(2)时tm=0xcccccccc,*tm=error,
程序运行到(3)时tm=0x43150653,*tm=error,
程序运行到(4)时tm=0x43150653,*tm=20,
程序运行到(5)时p=0x43150653,*p=20,
程序运行到(6)时p=0x43150653,*p=20,tm=error,*tm=error,
运行到(6)时tm被释放,但利用tm申请的内存空间并没有被释放,在本实例中利用p指针记录了tm所申请的内存空间的地址,如果没有定义p和p=tm;语句的话,右 } 到来时tm被释放,tm所申请的内存并没有被释放,并且失去了控制这段内存的把柄,这是相当危险的,并且是隐蔽的。在很多情况下如果不手动删除所申请的内存,便会产生内存溢出的后果,请看下面程序:
int main()
{
int *p;
{
for(int i=0;i<99999999;i++)
p=new int;
}
}
可以通过资源管理器察看内存使用情况,在局部代码结束时程序自动释放的是指针的那4个字节,而不是指针所指向的内存,也就是说指针不在了,但内存还在!
这就是为什么在Windows API中 hdc=GetDC(hwnd); 后必须调用RleaseDC(hwnd,hdc); GetDC是通过定义了一个指针申请了一块内存,把这块内存的地址交付外界,即传给hdc,要不然GetDC结束后这段内存就释放了,所以用完后,还要调用RleaseDC.
如此API函数可以分为如下几种:
(1). 用指针开辟内存,把指向这段内存的指针交付外界,函数结束时不释放内存。
(2)不管用什么方式开辟内存,把内存的一个拷贝给外界,函数结束时释放内存。如BebinPaint(hwnd,&ps),GetFontMetrics(&lf),其中的ps,lf必须是外界定义好的且已经开辟好内存空间了的,函数把ps,lf的一份拷贝给ps,lf.
(3)自生自灭,不留痕迹,对内存不会造成影响,如显示输出函数 。
- C++语言中用指针申请内存时产生的问题。
- C指针申请内存
- C语言连续申请变量内存问题
- C语言基础之函数、虚拟键盘的使用、数组、指针、动态申请内存、内存泄漏
- C语言基础之函数、虚拟键盘的使用、数组、指针、动态申请内存、内存泄漏
- 指针动态申请内存的问题
- C语言申请内存
- FPGA中用C语言指针实现内存测试
- C语言 结构体指针需要申请内存但函数定义指针不需要申请
- c中用malloc申请内存时出现两种不确定值的情况
- C语言动态内存的申请与释放及野指针
- C\C++语言指针的强大用法之减少内存申请次数
- C语言产生野指针的原因
- c++中指针的内存申请和内存释放问题
- c++中指针的内存申请和内存释放问题
- 【C/C++开发】C语言 DLL(动态链接库)中申请动态内存释放的问题
- c语言中的内存管理(重点:动态内存申请释放,野指针,指针函数)
- c/c语言多级指针的申请和释放
- 为ASP.NET封装的SQL数据库访问类
- ASP.NET程序中常用代码汇总(四)
- ASP.NET程序中常用代码汇总(五)
- 认识ASP.NET配置文件Web.config
- 备忘录和便签系统的模块概要
- C++语言中用指针申请内存时产生的问题。
- MapPoint+SmartPhone+C#开发示例
- FreeBSD中/etc下的文件简介
- dreamweaver8抢先看
- dynamic_cast
- [今日图书推荐]如何做好SQLServer数据库性能的优化
- NHibernate中文翻译文档(整理自DDLLY命名空间)
- Java 的多态
- 发布语法加亮编辑器控件(SyntaxTextBox)