Delphi内存管理
来源:互联网 发布:数据库管理员和程序员 编辑:程序博客网 时间:2024/05/08 22:31
======================================================
注:本文源代码点此下载
======================================================
一、什么是堆、栈?
程序需要的内存空间分为 heap(堆) 和 stack(栈),heap 是自由存储区, stack 是自动存储区,使用 heap 需要手动申请、手动释放, stack 是自动申请、自动释放,使用 heap 时, 如果只申请不释放, 就会发生"内存泄露",不需要申请和释放空间的元素, 譬如变量、结构(record)等, 是存与 stack(栈),反之如需要 create 和 free 的对象、需要 getmem 和 freemem 的指针等, 则是存于 heap(堆),stack 比 heap 快一点点。
二、内存管理
delphi自动管理的内存 delphi中原子变量,如integer、boolean、record、枚举等都是在作用域内编译器自动申请内存,出了作用域自动释放;另外,字符串、variant、动态数组、接口也是由delphi自动管理。 这些变量都是在栈中存储的,除了接口。另外,variant是程序员用函数。
1)delphi自动管理的内存
delphi中原子变量,如integer、boolean、record、枚举等都是在作用域内编译器自动申请内存,出了作用域自动释放;另外,字符串、variant、动态数组、接口也是由delphi自动管理。
这些变量都是在栈中存储的,除了接口。另外,variant是程序员用函数手工创建的,例如vararraycreate;动态数组也是程序员用函数手工创建的,例如setlength,但这两种情况都不需要程序员自己释放。
另外,还有一种变量需要注意,是使用threadvar声明的变量,它的作用域是一个线程。这主要用在编写线程函数时,每一个线程使用一个线程局部存储。
2)程序员手工管理的内存
指针和对象是需要程序员手工申请和释放的内存。指针包括pchar、pointer(无类型指针)、记录指针、变量指针(指向原子变量)、函数指针(例如回调函数,分为全局函数和对象方法)。使用new函数来申请内存,使用dispose来释放指针。另外,getmem、reallocmem和freemem也是一系列申请、释放内存的函数,可以通过getmemorymanager和setmemorymanager函数来读取和设置delphi的三个内存管理函数。
对象包括tobject和iunknown两颗继承树继承下来的子类对象。必须使用构造方法来构造对象。用构造方法(一般是create,也可以不是,delphi的编译器只认constructor的关键字)创建的对象,如果你没有指定拥有者,那么必须自己手动释放,即便是指定了拥有者也需要看实际需要在特定的时刻释放。释放一般使用free方法(iunknown则不需要手工释放),更好的方法是使用freeandnil(在sysutils.pas单元),它既释放占用的内存,同时释放指针本身。
这些变量都是在堆中存储的。另外一个需要注意的问题是,tlist中的指针都需要程序员自己释放。
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
- delphi内存管理
- delphi内存管理
- Delphi内存管理
- Delphi 动态内存管理
- delphi 内存管理,定期释放
- Delphi常用内存管理函数
- Delphi 7内存管理bug
- Delphi常用内存管理函数
- Delphi编程技巧(一)内存管理
- Delphi的内存管理及内存泄露问题
- delphi中Dispose内存释放及字符串内存管理
- delphi中增加FastMM4有效管理你的内存使用
- delphi 内存
- delphi 内存流 操作
- delphi 读写内存
- Delphi 释放内存
- delphi 内存 复制
- Delphi OleVariant 内存泄露
- 关于delphi和sql sever开发出的管理系统运行问题
- AJAX网络开发技术
- ω?zone咕咯
- Delphi环境下利用TComm组件实现串行通信
- Clark's Tech Blog
- Delphi内存管理
- Flex与Ajax交互方法
- java新手任何学习java(转载)
- Java 自学笔记 Oct-27(2)
- Java编程题90道
- 使用 Ajax 实现 lightbox
- 使用Ajax时的十个常犯的错误
- [推荐]前端性能分析工具:dynaTrace Ajax Edition
- 优化PHP程序的方法