如何简化临时内存的分配与释放
描述:在编制 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();
如何简化临时内存的分配与释放相关推荐
- FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- FFmpeg源代码简单分析-通用- 内存的分配和释放(av_malloc()、av_free()等)
参考链接 FFmpeg源代码简单分析:内存的分配和释放(av_malloc().av_free()等)_雷霄骅的博客-CSDN博客_av_malloc 内容介绍 内存操作的常见函数位于libavuti ...
- java怎么释放分配的内存,linux 内存的分配和释放,linux分配释放
linux 内存的分配和释放,linux分配释放 了解内存分配机制(共享映射与请求分页) 通过 pmap 命令,可以获取用户进程逻辑地址空间中映射的内存信息: pmap -x $pid 其中 -x 表 ...
- 结构体的使用和动态内存的分配及释放
结构体 什么是结构体?结构体是用户根据实际需要自己定义的复合数据类型.结构体的出现是为了表示一些复杂的数据,而普通的数据类型无法满足要求. 结构体的定义: struct Student //struc ...
- ffmpeg源代码处理流程分析_FFmpeg源代码简单分析:内存的分配和释放
内存操作的常见函数位于libavutil\mem.c中.本文记录FFmpeg开发中最常使用的几个函数:av_malloc(),av_realloc(),av_mallocz(),av_calloc() ...
- FFmpeg内存的分配和释放---av_malloc()、av_free()等
本文简单记录一下FFmpeg中内存操作的函数. 内存操作的常见函数位于libavutil\mem.c中.本文记录FFmpeg开发中最常使用的几个函数:av_malloc(),av_realloc(), ...
- 动态内存的分配与释放
1.new与delete运算 c++提供了两个中重要的运算符:new和delete.由于他们是运算符不是函数,因此执行效率更高. 运算符 功能 目 结合性 用法 new[] 动态分配 单目 自右向左 ...
- 比大小,人类智慧天花板,任意类型,任意个数。内容包含函数模板的创建,类的创建,动态内存的分配与释放,函数调用指针的用法。牵扯多个知识点。
比大小,看这一篇就足够,大家好,我是姜姜一名热爱C++编程的大学生,接下来我将通过代码演示如何利用C++实现任意类型,任意个数的比大小,并且找出最大的数. 由于本人比较懒,所有没写注释还请各位读者多多 ...
- 利用二叉树的思想来实现分配和释放内存方法
虽然大部分系统都有提供内存动态分配和释放函数(即C语言中的malloc和free函数),但是在嵌入式开发中由于系统的限制往往需要自己来实现内存管理,如在有些平台上可动态申请的最大空间不能满足程序设计的 ...
最新文章
- 《Linux命令详解手册》——Linux畅销书作家又一力作
- kint 一个强大的php调试助手
- MVC Html.AntiForgeryToken() 防止CSRF攻击
- glove中文词向量_Summary系列glove模型解读
- 怎样在vs中监视char*字符串_字符串指针数据类型
- 【转】C#开发笔记之05-迭代器中的状态机(State Machine)到底是什么?
- 非常好的Java反射例子
- 9.3. where 优化
- 好铁不打钉,好男不当网管-----论网管的自我修养 ...
- python之---Python深入06 Python的内存管理
- 剑指offer——面试题38:数字在排序数组中出现的次数
- Camera ISP与DSP的区别(二十五)
- E-prime实验设计常用技术
- 【JSP】 # JSP入门及简单概述
- 开关三极管的导通和截止条件
- java自动机字符串匹配_字符串匹配之有限自动机
- adbdriver的安装
- android10及以上通话录音
- 机器学习过程步骤总结
- 3D建模和渲染吃CPU还是显卡?专业显卡和游戏显卡的区别