在带有BSTR的结构体上执行memset
Performing a memset on struct with a BSTR
我目前有一个堆损坏,导致我的应用程序崩溃。我的应用程序是COM服务器(c++)编组到c#客户端应用程序。它看起来像一个SysFreeString可能从c#端作为COM清理的一部分被调用。我似乎无法确定原因,但是否有可能在c++方面对具有BSTR的结构进行memset 0导致问题?
以下内容有效吗?
memset(pResult, 0, sizeof(RESULT)) where pResult is of type RESULT
typedef struct _Result
{
DWORD dwResult;
BSTR strData;
} RESULT;
STACK_TEXT from WinDbg:
<>之前00000000 ' 77a7bc35 ntdll!?? :: FNODOBFM:: + 0 xea19"字符串"00000000 ' 77b4b520 ' 000007fe ' ffc41377 oleaut32!SysFreeString + 0 x5300000000 ' 77b4b528 000007fe ' ffc46b2e oleaut32!BSTR_UserFree + 0 x1e000007fe ' fe354a1c rpcr4 !NdrUserMarshalFree + 0 x4c00000000 ' 77b4b538 000007fe ' fe3566eb rpcr4 !NdrpFreeParams + 0 x20700000000 ' 77b4b540 000007fe ' fe365362 rpcr4 !NdrStubCall2 + 0 xedc00000000 ' 77b4b548 ' 000007fe ' fe84f16e ole32!CStdStubBuffer_Invoke + 0 x8b000007fe ' fe850ccd ole32!SyncStubInvoke + 0 x5d00000000 ' 77b4b558 ' 000007fe ' fe850c43 ole32!StubInvoke + 0 xdb000007fe ' fe70a4f0 ole32!x190 CCtxComChnl: ContextInvoke + 000000000 ' 77b4b568 000007fe ' fe8514d6 ole32!AppInvoke + 0 xc200000000 ' 77b4b570 ' 000007fe ' fe85122b ole32!ComInvokeWithLockAndIPID + 0 x52b00000000 ' 77b4b578 000007fe ' fe84fd6d ole32!ThreadInvoke + 0 x30d00000000 ' 77b4b580 ' 000007fe ' fe363254 rpcr4 !DispatchToStubInCNoAvrf + 0 x1400000000 ' 77b4b588 000007fe ' fe3633b6 rpcr4 !RPC_INTERFACE: DispatchToStubWorker + 0来000007fe ' fe365b8b rpcr4 !x9b RPC_INTERFACE: DispatchToStub + 000000000 ' 77b4b598 000007fe ' fe365ach rpcr4 !x5b RPC_INTERFACE: DispatchToStubWithObject + 000000000 ' 77b4b5a0 000007fe ' fe365a62 rpcr4 !x422 LRPC_SCALL: DispatchRequest + 000000000 ' 77b4b5a8 000007fe ' fe36375d rpcr4 !LRPC_SCALL: HandleRequest x20d + 0000000007fe ' fe3809ff rpcr4 !x3bf LRPC_ADDRESS: ProcessIO + 000000000 ' 77b4b5b8 000007fe ' fe3805b5 rpcr4 !LrpcIoComplete + 0 xa500000000 ' 77a2b6bb ntdll!TppAlpcpExecuteCallback + 0 x26b00000000 ' 77a2ff2f ntdll!TppWorkerThread + 0 x3f800000000 ' 7790652d内核32!BaseThreadInitThunk + 0 xd00000000 ' 77a3c541 ntdll!RtlUserThreadStart + 0 x1d是否有可能在c++一侧对具有BSTR的结构进行memset 0导致问题?
不,BSTR
是一个指针类型(typedef OLECHAR *BSTR;
),所以用memset
清除它的值最多会导致内存泄漏,但不会导致崩溃。
自从我弄乱了这个东西已经有一段时间了,但我认为BSTR
是一个令人讨厌的地方,wchar_t *
指针不指向缓冲区的开始。SysFreeString()
实际上会释放(ptr-1)或类似的东西。用memset()
将其归零听起来是个坏主意。
如果异常出现在COM清理代码中。当然,这个结果结构的分配存在问题。
请确保:
如何将参数传递给函数
In Parameter =>如果这个参数作为In Parameter传递,那么它是由客户端分配的,你不能重新分配这个参数,否则你会得到这个异常。
InOut Parameter =>如果该参数为InOut Parameter,则可以重新分配该参数。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- C++17中的并行执行策略
- QML按钮点击功能执行顺序
- 程序在执行程序的其余部分之前退出
- 为什么catch中的代码没有被执行
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 将执行、作业和WinAPI相乘
- 对字符数组中的元素执行逐位操作
- 为什么g++在未执行的代码处标记强制转换错误
- 在带有BSTR的结构体上执行memset