阅读:947回复:0
请教一个关于分配和释放串缓冲区的问题
在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释放该缓冲区,以避免内存泄漏。 他下面的注释是不是说对于非动态分配的内存不可以释放,而动态则可以?如果是这样的话,对非动态的内存该怎么来释放其资源呢? 小弟才看了没多久,望各位兄台多多指点,这里谢过了。 |
|