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^)/