划清代码职责

错误是具有传染性的。有时一个模棱两可的处理,可能在将来某个时间就会触发更为严重的问题。比如,下面的代码(来源于真实项目)

for (it = vec.begin(); it != vec.end();)
{
    if (dosomething(*it) == TRUE)
       it = vec.erase(it);
    else
       it++;
}

如果dosomething失败,函数就返回。看起来是没有太大问题。不过,偏偏dosomething做的是内存释放,可能是释放了某个对象,后面的某个操作失败导致返回错误。现在的问题是:vec到底应不应该删掉这一项?

这里他们没有删除,但后来出现问题了。dosomething掉某个指针删除后,又被vec拿到别的地方使用!最终的结果当然是crash了。


双方都有充分的理由。那么,我们该如何避免此类问题呢?

沟通当然是解决问题最简便的方法。dosomething的作者A宣称,你需要给我一个有效的指针,但我不保证每次都做好,所以,如果我有问题了,你不要再使用这个指针了!B在这里称,“没错,你失败后我确实没做什么了,直接跳过啦!”。只不过,这种跳过是忽略错误,下一次就“跳不过”了。

职责界定不清,就给双方扯皮的理由。其实我们可以参考很多动态语言里的作法:我的就是我的,我不给你,你就不要动;我若给你,我就不要再动”。一方面,对于A,这个指针,如果别人没有明确给你,或者你没有明确要求得到,那么你就不应该释放它;对于B,如果你确实想把指针交给A,那么你就应该彻底放弃再使用了,或者,就指明,这个是我管理的,A你不要动。

还有一种比较严格的划分,就是”谁创建,谁释放;谁污染,谁治理“。在指针满天飞的C中,这可能会让很多地方为了安全而不得不”深拷贝“。总之,在适当的安全前提下,可以做得灵活些。

你可能感兴趣的:(c,语言,Crash)