mjq_nju
驱动牛犊
驱动牛犊
  • 注册日期2004-07-06
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:947回复:0

请教一个关于分配和释放串缓冲区的问题

楼主#
更多 发布于:2004-07-10 16:09
在Water Oney 写的《Programming the Microsoft Windows Driver Model》第三章 基本编程技术中的字符串操作那一节中讲到“分配和释放串缓冲区”那一块时举了一个函数片断为例,如下:
UNICODE_STRING foo;
if (bArriving)
  RtlInitUnicodeString(&foo, L"Hello, world!");
else
{
  ANSI_STRING bar;
  RtlInitAnsiString(&bar, "Goodbye, cruel world!");
  RtlAnsiStringToUnicodeString(&foo, &bar, TRUE);
}
...
RtlFreeUnicodeString(&foo); //  <--don't do this!
 

在第一种情况下,我们为驱动程序中的宽字符串常量初始化foo.Length、foo.MaximumLength,和foo.Buffer。在另一种情况下,我们要求系统(使用第三个参数为TRUE的RtlAnsiStringToUnicodeString调用)为转化ANSI串分配内存。在第一种情况下,调用RtlFreeUnicodeString就是一个错误,因为它将无条件地释放常量串“Hello, world!”占用的内存,由于foo串的Buffer成员指向一个常量串,不是动态分配的内存,所以根本不能释放。在另一种情况下,由于我们指定了TRUE参数,系统为表达转换结果动态地分配了Unicode串缓冲区,所以我们必须调用RtlFreeUnicodeString释放该缓冲区,以避免内存泄漏。


他下面的注释是不是说对于非动态分配的内存不可以释放,而动态则可以?如果是这样的话,对非动态的内存该怎么来释放其资源呢?

小弟才看了没多久,望各位兄台多多指点,这里谢过了。
游客

返回顶部