3, 讨论了malloc,free,realloc三个函数的“外壳”包装,分别为bool fNewMemory(void **ppv,size_t size); void FreeMemory(void *ppv); bool fResizeMemory(void **ppv,size_t Newsize);
#define bGarbage 0xA3
bool fNewMemory(void **ppv, size_t size)
{
byte **ppb = (byte**) ppv;
ASSERT( ppv!=null && size>0 );
*ppb =(byte*) malloc(size);
#ifdef DEBUG
{
if( *ppb != NULL)
{
memset( *ppb, bGarbage ,size);
}
}
#endif
return ( *ppb != NULL);
}
4, 代码中不会自己生出错误来,错误是程序员编写新代码或者修改现有代码的产物。如果你想发现代码中的错误,没有哪个办法比在对代码进行编译时对其进行逐条跟踪更好。
虽然直观上你可能认为对代码进行走查会花费大量的时间,但这是不对的。刚开始进行代码的走查确实要多花一点时间,但当这一切习惯成自然之后并不会多花多少时间,你可以很快地走查一遍。
一定要对每一条代码路径进行逐条的跟踪,至少要跟踪一遍,尤其是对代码中的错误处理部分。不要忘记 &&、|| 和?:这些运算符,它们每个都有两条代码路径需要进行测试。
在某些情况下也许需要在汇编语言级对代码进行逐条的跟踪。尽管不必经常这样做,但在必要的时候不要回避这种做法。