ETW调用是否接管字符串指针所有权?内存泄漏相关技术问询
ETW Provider内存泄漏问题:传入EventWrite的字符串能否立即释放?
我实现了一个ETW Provider,但Visual Studio调试CRT报告存在内存泄漏。问题出在注册事件时堆上创建的wchar_t*:
auto msg = convertToWchar(string); // 内部调用new wchar_t[]分配内存 EventWriteBegin(msg);
EventWriteBegin是ETW编译器生成的Template_xyz函数的宏定义,代码如下:
ULONG Template_xyz( _In_ REGHANDLE RegHandle, _In_ PCEVENT_DESCRIPTOR Descriptor, _In_opt_ PCWSTR _Arg0) { #define ARGUMENT_COUNT_zdf 1 EVENT_DATA_DESCRIPTOR EventData[ARGUMENT_COUNT_zdf]; EventDataDescCreate(&EventData[0], (_Arg0 != NULL) ? _Arg0 : L"NULL", (_Arg0 != NULL) ? (ULONG)((wcslen(_Arg0) + 1) * sizeof(WCHAR)) : (ULONG)sizeof(L"NULL")); return EventWrite(RegHandle, Descriptor, ARGUMENT_COUNT_zdf, EventData); }
我的疑问是:将PCWSTR参数传入EventDataDescCreate并调用EventWrite()之后,是否可以立即释放传入的字符串?目前EventDataDescCreate()和EventWrite()的官方文档并未明确说明参数的生命周期要求。
可以立即释放传入的字符串。
ETW的EventWrite是同步调用,函数执行期间会完成事件数据的复制工作——内核会把你传入的字符串数据拷贝到ETW的内部缓冲区中,不会持有对用户态内存的引用。也就是说,一旦EventWrite返回,你就可以安全地释放之前分配的wchar_t*内存,不会影响事件的正常记录。
你遇到的CRT内存泄漏提示,正是因为当前代码没有释放msg指向的堆内存,只要在EventWriteBegin(msg);之后添加delete[] msg;就能解决这个泄漏问题。
内容的提问来源于stack exchange,提问作者the_mandrill
相关产品推荐
相关产品推荐

