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

2016-02-19 17:18 3 1 收藏

给自己一点时间接受自己,爱自己,趁着下午茶的时间来学习图老师推荐的如何简化临时内存的分配与释放,过去的都会过去,迎接崭新的开始,释放更美好的自己。

【 tulaoshi.com - 编程语言 】

  描述:在编制 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中发生异常同样会自动释放内存
}

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

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

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

  

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

  应用示例如下:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  

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

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

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

  TWaitCursor wait;

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

  TWaitCursor wait();

来源:http://www.tulaoshi.com/n/20160219/1614904.html

延伸阅读
做Android项目的时候发现一个问题:当应用程序退出了,点击"设置"查看应用程序,界面显示着可以点击"强制关闭". 我认为造成这样的原因是还有开启的activity没有被destroy,然后做调试,之后发现开启的activity应该是全部都被destroy了.但是结果还是显示可以点击"强制关闭".  由于这个问题我发现了一个更加严重的问题,那就是,在我应用程序退出...
标签: 电脑入门
MAC的冬眠模式是很多硬盘比较小的用户们很讨厌的,因为它会大量的占据我们的硬盘空间,怎么禁止冬眠模式,成为许多用户的难题。图老师小编寻找了许久之后,终于找到了解决这个问题的方法,现在就和大家一起分享吧。 以前介绍过用命令行方法禁用冬眠模式,只要在终端里运行 sudo pmset -a hibernatemode 0 即可。 但这招在 Mac OS X 10.7 ...
标签: SQLServer
SQL服务器有两种基本管理方法:动态分配和静态分配,用以控制程序可使用的内存数量。动态分配允许管理员声明一块内存的大小;考虑到它的实际使用,SQL服务器可以分配给其需要占用的内存的最大值,并且(理论上)在没有使用内存的情况下将其释放。静态分配则是创建一块固定的内存空间,提供给SQL Server使用——不再进行分配。 在默认情况下,...
C语言的位字段是个比较有意思的特性。它的目的是在一个机器字中保存多个对象(每个对象占据若干bit),从而节省内存资源,同时又避免复杂的位运算。在此不再讨论位字段的具体语法,下面将研究位字段的存储特性。 先说含有多个字段(field)的字(word)所占空间的规律——含有多个字段的字的大小是所有字段的类型中的最长的那个的倍数。但要...
本文首先提出了处理VC++中结构体时应注意的一个问题,然后详细分析了存在该问题的原因,最后做实战训练。       注意:      (1)在VC下,下面各类型占字节数为:char-unsigned int -1; short int -2; int -unsigned int -4;  long -float-4;   double -long double -8  ...

经验教程

549

收藏

69
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部