描述:在编制 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();

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

  1. FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  2. FFmpeg源代码简单分析-通用- 内存的分配和释放(av_malloc()、av_free()等)

    参考链接 FFmpeg源代码简单分析:内存的分配和释放(av_malloc().av_free()等)_雷霄骅的博客-CSDN博客_av_malloc 内容介绍 内存操作的常见函数位于libavuti ...

  3. java怎么释放分配的内存,linux 内存的分配和释放,linux分配释放

    linux 内存的分配和释放,linux分配释放 了解内存分配机制(共享映射与请求分页) 通过 pmap 命令,可以获取用户进程逻辑地址空间中映射的内存信息: pmap -x $pid 其中 -x 表 ...

  4. 结构体的使用和动态内存的分配及释放

    结构体 什么是结构体?结构体是用户根据实际需要自己定义的复合数据类型.结构体的出现是为了表示一些复杂的数据,而普通的数据类型无法满足要求. 结构体的定义: struct Student //struc ...

  5. ffmpeg源代码处理流程分析_FFmpeg源代码简单分析:内存的分配和释放

    内存操作的常见函数位于libavutil\mem.c中.本文记录FFmpeg开发中最常使用的几个函数:av_malloc(),av_realloc(),av_mallocz(),av_calloc() ...

  6. FFmpeg内存的分配和释放---av_malloc()、av_free()等

    本文简单记录一下FFmpeg中内存操作的函数. 内存操作的常见函数位于libavutil\mem.c中.本文记录FFmpeg开发中最常使用的几个函数:av_malloc(),av_realloc(), ...

  7. 动态内存的分配与释放

    1.new与delete运算 c++提供了两个中重要的运算符:new和delete.由于他们是运算符不是函数,因此执行效率更高. 运算符 功能 目 结合性 用法 new[] 动态分配 单目 自右向左 ...

  8. 比大小,人类智慧天花板,任意类型,任意个数。内容包含函数模板的创建,类的创建,动态内存的分配与释放,函数调用指针的用法。牵扯多个知识点。

    比大小,看这一篇就足够,大家好,我是姜姜一名热爱C++编程的大学生,接下来我将通过代码演示如何利用C++实现任意类型,任意个数的比大小,并且找出最大的数. 由于本人比较懒,所有没写注释还请各位读者多多 ...

  9. 利用二叉树的思想来实现分配和释放内存方法

    虽然大部分系统都有提供内存动态分配和释放函数(即C语言中的malloc和free函数),但是在嵌入式开发中由于系统的限制往往需要自己来实现内存管理,如在有些平台上可动态申请的最大空间不能满足程序设计的 ...

最新文章

  1. 《Linux命令详解手册》——Linux畅销书作家又一力作
  2. kint 一个强大的php调试助手
  3. MVC Html.AntiForgeryToken() 防止CSRF攻击
  4. glove中文词向量_Summary系列glove模型解读
  5. 怎样在vs中监视char*字符串_字符串指针数据类型
  6. 【转】C#开发笔记之05-迭代器中的状态机(State Machine)到底是什么?
  7. 非常好的Java反射例子
  8. 9.3. where 优化
  9. 好铁不打钉,好男不当网管-----论网管的自我修养 ...
  10. python之---Python深入06 Python的内存管理
  11. 剑指offer——面试题38:数字在排序数组中出现的次数
  12. Camera ISP与DSP的区别(二十五)
  13. E-prime实验设计常用技术
  14. 【JSP】 # JSP入门及简单概述
  15. 开关三极管的导通和截止条件
  16. java自动机字符串匹配_字符串匹配之有限自动机
  17. adbdriver的安装
  18. android10及以上通话录音
  19. 机器学习过程步骤总结
  20. 3D建模和渲染吃CPU还是显卡?专业显卡和游戏显卡的区别

热门文章

  1. 【电影】美丽心灵的永恒阳光
  2. 趋势不能deploy的解决方法
  3. 社区的代码规范及e2e测试
  4. 2016.6.23 随笔———— AJAX
  5. Android组件之Service
  6. SQL 语句中对于like 的调优
  7. 机器学习导论(张志华):多项式分布
  8. 单核工作法18:简化协作(下)
  9. CUDA从入门到精通(三):必备资料
  10. python自定义函数添加到路径