编程习惯:提供内存分配的成对原则

  读《windows核心编程 4ed》(Jeffrey Richter 著 黄陇、李虎 译)后的笔记
开发人员可能会犯这么一个错误:提供申请内存空间的函数,却没有提供对应的释放空间的函数,而是寄希望于用户(程序员)通过标准释放方式来解决问题。

如以下代码:
  1. VOID EXEFunc()
  2. {
  3.     PVOID pv = DLLFunc();
  4.     free(pv);
  5. }
  6. PVOID DLLFunc()
  7. {
  8.     return (malloc(100));
  9. }

在一般情况下,这么做(调用free)不会有什么问题,但这不绝对:
1、正如书中所言(P487),如果EXEFunc()和DLLFunc()两者或其中之一链接到静态版本的C/C++运行时库,
则对free的调用就会失败。
2、补充:不该对DLLFunc的实现做假设!假如它的实现调用的不是malloc而是new,或者自定义的内存池呢?
接口和实现的分离原则确保了接口的稳定性,但实现却可以变化。

基于以上原因,正确的设计是同时编写一个DLLFreeFunc函数:
  1. BOOL DLLFreeFunc(PVOID pv)
  2. {
  3.     return ( free(pv) );
  4. }

你可能感兴趣的:(编程,windows)