栈(stack)与堆(heap)是C|C++中常见的概念,要想学好C|C++,我们也必须了解这两个概念的区别与联系。但BCB中的VCL是用object pascal语言写的,她具有object pascal的很多特性,这要我们在使用时注意,下面就我在这方面的学习感受写点观点供朋友们参考。
栈是存放函数的所有动态局部变量及函数调用和返回的有关信息的一块内存。栈的内存管理严格遵循先进后出的顺序,这一点正是实现函数调用所需要的。从栈中分配内存效率特别高。数据对象使用栈中的内存(如动态局部变量)比使用堆中内存会使程序运行更快。
堆是供malloc()、calloc()、realloc()和new等函数获取内存空间的一块内存。从堆中获取内存比从栈中要慢得多,但堆的内存管理却比栈灵活得多,任何时候你都可以从堆中获取(或释放)内存,我们可以按任意顺序进行。用来存放递归数据结构的内存几乎都要从堆中获取。用来存放字符串的内存通常也从堆中获取,尤其是对那些在程序运行时可能出现的很长的字符串。
从堆中获取的内存要用free()、delete来释放,它本身不会自动释放。
由于Object Pascal中所有的对象都只能建构于堆中,无法和C++一样,能够在栈(在函数内创建类的对象)、数据区段(在函数外创建类的对象)、堆(用new等函数来创建类的对象)三种地方建立对象,所以VCL类的对象我们只能在堆中创建。
如创建一个按钮对象,我们可以这样来创建:
TButton *btnMy= new Tbutton(NULL);
可以写成如下程式:类名 *对象名=new 类名();
()里面可以是你已创建的该类对象实体的名字、工程的名字、或NULL、当然有时可能用的还是this指针,这要你在应用过程中灵活使用了。
但是你不要忘记了BCB是对C|C++的国际标准支持最好的,在正常的情况下,你完全可以灵活的运用堆和栈的。