You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 04:56:12