How to avoid common errors and make program efficient.

转载 2007年10月15日 20:48:00
How to avoid common errors and make program efficient.

From Forum Nokia Wiki

Jump to: navigation, search

Following are the general tips for avoiding unnecssary and common errors,

and make your program efficient.


Contents

[hide]

[edit] KERN-EXEC 3

Kern-Exec 3 crashes are often caused due to stack corruption or stack Overflow, prefer the use of heap to the stack. Be aware that recursive functions can eat the stack at runtime — this will lead to a Kern-Exec 3 panic.


[edit] Some common errors for application panic

• Failure to have properly added a non-member, heap-allocated variable to the Cleanup Stack. • The ‘double delete’ – e.g. failure to correctly Pop() an already destroyed item from the Cleanup Stack, causing the stack to try to delete it again at a later time. • Accessing functions in variables which may not exist in your destructor;

e.g.







The above statement should always be coded as










• Putting member variables on the Cleanup Stack – never do this, just delete them in your destructor as normal.


[edit] Use CleanupClosePushL()

Always use CleanupClosePushL() with R classes which have a Close() method. This will ensure they are properly cleaned up if a leave occurs.

For example:








[edit] HBufC

Always set member HBufC variables to NULL after deleting them. Since HBufC allocation (or reallocation) can potentially leave, you could find yourself in a situation where your destructor attempts to delete an HBufC which no longer exists.


You don’t need to use HBufC::Des() to get into an HBufC. All you have to do is dereference the HBufC with the * operator – this is particularly relevant, for example, when passing an HBufC as an argument to a method which takes a TDesC& parameter.


[edit] _L() Macro

Dont use the _L() macro in your code. you should prefer _LIT() instead. The problem with _L() is that it calls the TPtrC(const TText*) constructor, which has to call a strlen() function to work out the length of the string. While this doesn’t cost extra RAM, it does cost CPU cycles at runtime. By contrast, the _LIT() macro directly constructs a structure which is fully initialized at compile time, so it saves the CPU overhead of constructing the TPtrC.

Alternatively, you can use following macros instead of _L():





It gets rid of strlen, but still TPtrC constructors are not inline functions.

[edit] TRAP

If you have cause to use a TRAP of your own, do not ignore all errors. A common coding mistake is:







This means all other error codes are ignored. If you must have a pattern like the above, leave for other errors:










[edit] Cleanup Stack

Do not wait to PushL() things on to the Cleanup Stack. Any newly allocated object (except member variables) should be added to the stack immediately. For example, the following is wrong:







because the allocation of Object2 could fail, leaving Object1 ‘dangling’ with no method of cleanup. The above should be:










[edit] Don't push objects on the cleanup stack twice

Always remember that functions with a trailing C on their name automatically put the object on the Cleanup Stack. You should not push these objects onto the stack yourself, or they will be present twice. The trailing C functions are useful when you are allocating non-member variables.


[edit] Two-phase construction

Two-phase construction is specially designed to avoid memory leaks, It is essential that you implement this design pattern to avoid memory leaks in your code.For each line of code you write, a good question to ask yourself is ‘Can this line leave?’. If the answer is ‘Yes’, then think: ‘Will all resources be freed?’.


[edit] Descriptors as function parameters

When using descriptors as function parameters, use the base class by default. In most cases, pass descriptors around as a const TDesC&. For modifiable descriptors use TDes&.



[edit] When using Active Objects, be careful of the following things

• There is no need to call TRAP() inside RunL(). The Active Scheduler itself already TRAPs RunL() and calls CActive::RunError()after a leave.
• To this end, you should implement your own RunError() function to handle leaves from RunL().
• Keep RunL() operations short and quick. A long-running operation will block other AOs from running.
• Always implement a DoCancel() function and always call Cancel() in the AO destructor.

[edit] Ensure your application responds to system shutdown events

It is vital that you respond to EEikCmdExit (and any platform-specific events, for example EAknSoftkeyBack and EAknCmdExit on Series 60) in your AppUi::HandleCommandL() method.




[edit] Make use of the Active Object framework wherever possible

Tight polling in a loop is highly inappropriate on a battery powered device and can lead to significant power drain.


[edit] Program compiles for WINS but not for ARMI

Your program compiles for WINS even runs on the emulator but gives errors during ARMI build. Possible reason for this is you have left a space in the header file name i.e. instead of #include "headerfile.h" you've typed #include "headerfile.h ". Just remove that space and the compile again.


[edit] HTTP Posts

In case of HTTP posts with forms always remember to delete the instance of CHTTPFormEncoder. If it is a php script on your server the Form elements are read bottom to top whereas python script reads the Form elements top to bottom. So what may seem to work on php wont work if the scripting language is changed to python. So always:









如何创造一个伟大的城市(How to make a city great)

是什么让一个伟大的城市,这是一个迫在眉睫的问题,与36亿城市人口的今天,日益疲困的世界经济增长相比,到2030年,50亿人,占世界人口的60%将居住在城市。 在发展中国家领导人必须应对规模空前的城市化...
  • imodan
  • imodan
  • 2013年09月11日 11:04
  • 1327

HDU 1056 HangOver (简单数学题)

题意: 意思就是 你输入一个长度,问你最少用几张卡片能 让伸出去的长度大于等于你输入的长度.公式题目题目上面有 Problem Description How far...
  • h1021456873
  • h1021456873
  • 2016年01月15日 14:16
  • 947

如何创造财富——How to Make Wealth

Paul Graham在《黑客与画家》这本书中也放进了这篇文章,在他的博客上可以看到英文原版内容。阐述了如何通过创业的过程,创造财富,让你实现财务自由和生活自由。“How to Make Wealth...
  • www19940501a
  • www19940501a
  • 2014年03月25日 19:41
  • 1364

c# 读取 写入 xml 文档

写入xml 方法:    public void WritetokenToXml(string _token)         {             string file = Serv...
  • dingxingmei
  • dingxingmei
  • 2013年03月06日 18:11
  • 591

免费HTTPS证书不是梦!在Ubuntu(Linux)的VPS上使用Let's Encrypt为一堆域名申请并安装HTTPS证书

免费HTTPS证书不是梦!在Ubuntu(Linux)的VPS上使用Let's Encrypt为一堆域名申请并安装HTTPS证书 情景: 你拥有一个VPS,能使用命令行ssh登陆到服务...
  • qq285744011
  • qq285744011
  • 2017年12月14日 16:46
  • 62

如何用C++语言编程(How to program in C++)

这几年在公司一直带徒弟,每次必教的内容就是C++。在我看来,C++已经有非常好的教材了(注1),实在没有必要从头教起。自学就可以了,可是结果总是不尽人意。 不想再重复一次“把C++当成一门新语言来学...
  • u013301846
  • u013301846
  • 2014年02月24日 15:22
  • 440

编译ant compile-native遇到的一些问题

环境: Ubuntu Server12.04 Hadoop1.2.1
  • px_dn
  • px_dn
  • 2014年04月23日 22:47
  • 1659

Django中管理使用静态文件

Managing static files 原文地址:https://docs.djangoproject.com/en/dev/howto/static-files/ Django deve...
  • End0o0
  • End0o0
  • 2013年02月17日 17:18
  • 2392

FL Studio 12基础教程+软件安装包

FL Studio即“Fruity Loops Studio”,也就是众所熟知的水果软件, 全能音乐制作环境或数字音频工作站(DAW)。FL Studio可以编曲、剪辑、录音、混音,让你的计算机成为全...
  • DD161225
  • DD161225
  • 2017年12月20日 10:10
  • 152

编译Android Source时碰到的问题

1、host Java: jsr305lib (out/host/common/obj/JAVA_LIBRARIES/jsr305lib_intermediates/classes) /bin/ba...
  • zaizaishan
  • zaizaishan
  • 2013年05月20日 15:31
  • 3082
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:How to avoid common errors and make program efficient.
举报原因:
原因补充:

(最多只允许输入30个字)