如何简化临时内存的分配与释放

描述:在编制 C++ 程序时,最常遇到的一个令人恼火的问题便是临时资源的分配与释放问题, 由于程序的逻辑关系通常很复杂,引发异常的可能性也很多,为了妥善处理运行时异常, 我们不得不在可能引发异常的任何地方释放已分配成功的临时资源,然后返回, 以保证程序的健壮稳定及系统的清洁,所以程序中可能随处可见delete、free等语句, 显得很繁! 那么有没有办法使得只顾分配、使用临时资源,而不顾其后事如何呢?

在Delphi中可以用try...finally...实现一些资源的保护,但C++Builder中好象没有try...finally 这样的语法结构, 所以,在程序中为了正确释放内存等临时资源,不得不在有可能出错的任何地方书写释放语句delete,以保护有限的资源。 其实有一个较简单的方法可以一劳永逸,即为临时资源定义一个公共的类,将C++的new / delete语句稍作封装即可,类的定义如下:

TMemory{
public:
void *ptr;
public:
TMemory(int size){ ptr=(void*)new char[size]; _WINAPI_::ZeroMemory(ptr,size);}
~TMemory(void){ if(ptr) delete ptr; }
};
应用示例如下:
void TMainForm::function(int size)
{
TMemory mem(size); //注意捕获异常:EOutOfMemory!
char *str=(char *)mem.ptr; //取得分配的内存指针
some_func(str); //其它操作
return; //直接返回,而不必担心释放内存,即使some_func中发生异常同样会自动释放内存
}

如何简化等待光标的的设置与还原 ?

--------------------------------------------------------------------------------

解决问题的原理同上,类的定义如下:

#pragma warn -bei //关闭枚举变量赋值的警告
class TWaitCursor{//自动处理等待光标,当函数调用栈解体时自动还原光标
private:
TCursor oldc;
public:
TWaitCursor(void) : oldc(Screen->Cursor){ Screen->Cursor = crHourGlass; }
~TWaitCursor(void){ Screen->Cursor = oldc; }
};

应用示例如下:

void TMainForm::function(void)
{
some_opr(...); //其它操作
TWaitCursor waitit; //变为等待光标
some_func(...); //其它操作
return; //直接返回,光标会自动还原
}

当创建TWaitCursor类的临时变量时,光标会改为等待状态,当该函数返回时,会自动还原光标。

注:创建自动变量时应采用如下方式,以避免Borland编译器的自动优化:

TWaitCursor wait;

而不能定义成下面的样子:

TWaitCursor wait();

时间: 2024-10-16 05:47:12

如何简化临时内存的分配与释放的相关文章

c语言中内存的分配与释放的例子

首先我们来科普一下: 什么是堆?说到堆,又忍不住说到了栈!什么是 栈? 1.什么是堆:堆是大家共有的空间,分全局堆和局部堆.全局堆就是所有没有分配的空间,局部堆就是用户分配的空间.堆在操作系统对进程 初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏. 2.什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的.栈在线程开始的时候初始化,每个线程的栈互相独立.每个函数都有自己的栈,栈被用来在函数之间传递参数.操作系统在切换线程的时候会自动的切换

C语言内存分配与释放的详解

什么是堆?说到堆,又忍不住说到了栈!什么是 栈? 1.什么是堆:堆是大家共有的空间,分全局堆和局部堆.全局堆就是所有没有分配的空间,局部堆就是用户分配的空间.堆在操作系统对进程 初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏. 2.什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的.栈在线程开始的时候初始化,每个线程的栈互相独立.每个函数都有自己的栈,栈被用来在函数之间传递参数.操作系统在切换线程的时候会自动的切换栈,就是切换SS/ES

内存分配和释放

     自从学习了C语言,老师就教导我们说:对于动态内存的申请和释放,一定要遵守"谁申请,谁释放"的原则.在此原则的指导下,不仅是我.不仅是你,就连特级大师都设计了这样怪怪的函数: 函数 说明 评论 GetWindowText(HWND,LPTSTR,int) 取得窗口标题.需要在参数中给出保存标题所使用的内存指针,和这块内存的尺寸. 晕!我又不知道窗口标题的长度,居然还要我提供尺寸?!没办法,只能估摸着给一个大一些的尺寸吧. sprintf(char *,const char *,

C语言中多维数组的内存分配和释放(malloc与free)的方法_C 语言

如果要给二维数组(m*n)分配空间,代码可以写成下面: 复制代码 代码如下: char **a, i; // 先分配m个指针单元,注意是指针单元 // 所以每个单元的大小是sizeof(char *) a = (char **) malloc(m * sizeof(char * )); // 再分配n个字符单元, // 上面的m个指针单元指向这n个字符单元首地址 for(i = 0; i < m; i++) a[i] = (char * )malloc(n * sizeof(char )); 释

linux驱动开发--内核空间中内存的申请与释放

1.Linux内存管理 linux内存最小管理单位为页(page),通常一页为4kb. linux系统中,在初始化时,内核为每个物理内存页建立一个page的管理结构,操作物理内存时实际上就是操作page页. 物理地址:出现在cpu地址总线上的寻址物理内存的地址信号,是地址变换的最终结果. 线性地址(虚拟地址):在32位cpu架构上,可以表示4G的地址空间,也就是0x00000000-0xFFFFFFFF. 逻辑地址:实际上是一个相对地址,是程序代码经过编译之后在汇编程序中出现的地址. linux

C++ DLL接口结构体的转寰问题,究竟字符串内存的分配是怎样的

问题描述 C++ DLL接口结构体的转寰问题,究竟字符串内存的分配是怎样的 为什么VB6.0不需要释放内存,而同样的结构体在C++ DLL使用,C++自己反倒需要释放内存呢?字符串有什么不同? 解决方案 http://blog.csdn.net/jiftlixu/article/details/5351741 解决方案二: 结构体的内存对齐问题 解决方案三: VB和C++的思想完全不同,不建议进行对比.C++中的字符串需要看定义方法,定义成char数组的不需要释放内存,定义成char*则需要.V

《并行计算的编程模型》一3.4.2 分配和释放

3.4.2 分配和释放 对称堆的分配和释放函数与C语言标准的分配和释放函数类似,唯一复杂的因素是用户必须确保每个PE在大小和顺序上执行完全相同的分配序列.这样做能确保对称堆的一致性,允许PE使用自身对象的地址定位对称对象.对称准则:每个PE的分配和释放操作都要按相同的顺序并使用相同的变量来执行.不能保证必要的对称性至少会导致程序挂起,因为分配是全局同步事件.代码清单3-2通过创建三个对称对象展示了这一准则.数组a和b通过static关键字保证了对称,指针c指向了另一块由shmalloc()分配再

WinApi学习笔记-分配和释放虚拟内存

Code#include <windows.h>#include <stdio.h>#include <iostream> using namespace std; int main(void){    SIZE_T sizeVirtual = 4000;//大小    LPVOID lpRound = (LPVOID)0x100000FF;//地址    MEMORY_BASIC_INFORMATION mbi;//内存信息     //分配内存    //MEM_C

python使用cStringIO实现临时内存文件访问的方法

 这篇文章主要介绍了python使用cStringIO实现临时内存文件访问的方法,涉及Python使用cStringIO模块操作内存的技巧,需要的朋友可以参考下     本文实例讲述了python使用cStringIO实现临时内存文件访问的方法.分享给大家供大家参考.具体分析如下: 如果希望从网络读取文件进行处理,但是又不希望保存文件到硬盘,可以使用cStringIO模块进行处理 ? 1 2 res = urllib2.urlopen(pic,timeout=10) f = cStringIO.