如果事先没有调用 VariantInit,VariantClear 是否有可能使软件崩溃?
Is it possible for VariantClear to crash software if VariantInit is not called beforehand?
我有一个无法轻易复制的异常,但我非常怀疑它发生在 VariantClear()
。
我有一个定义变体的函数,然后将其传递给另一个变体,而无需先调用 VariantInit()
。被调用的函数然后在这个变体上调用 VariantClear()
,这可能是异常的来源。
void Func1()
{
VARIANT vData;
//VariantInit(&vData); // no variant clear was done. Will adding this line stop the crash below?
Func2(vData);
}
void Func2(VARIANT& vData)
{
// some code here
VariantClear(&vData); <-- this line crashes, why??
// some code here
}
谁能解释为什么 VariantClear()
会抛出异常?在 Func1()
中调用 VariantInit()
会阻止此异常的发生吗?
VariantClear
检查 VARIANT
的前 16 位以查找变体类型。
根据类型,VariantClear
可能调用 CoTaskMemFree
或将变体视为它调用 Release
的 COM 指针。如果类型无效,您可能会崩溃或释放一些不相关的内存。
如果类型是 VT_EMPTY
、VT_NULL
或数字类型,它只是将所有字段设置为零。
如果您不初始化 VARIANT
,类型是未定义的,它可能是前一个操作留在内存中的任何值。因此,您必须先在 VARIANT
.
上调用 VariantInit
我有一个无法轻易复制的异常,但我非常怀疑它发生在 VariantClear()
。
我有一个定义变体的函数,然后将其传递给另一个变体,而无需先调用 VariantInit()
。被调用的函数然后在这个变体上调用 VariantClear()
,这可能是异常的来源。
void Func1()
{
VARIANT vData;
//VariantInit(&vData); // no variant clear was done. Will adding this line stop the crash below?
Func2(vData);
}
void Func2(VARIANT& vData)
{
// some code here
VariantClear(&vData); <-- this line crashes, why??
// some code here
}
谁能解释为什么 VariantClear()
会抛出异常?在 Func1()
中调用 VariantInit()
会阻止此异常的发生吗?
VariantClear
检查 VARIANT
的前 16 位以查找变体类型。
根据类型,VariantClear
可能调用 CoTaskMemFree
或将变体视为它调用 Release
的 COM 指针。如果类型无效,您可能会崩溃或释放一些不相关的内存。
如果类型是 VT_EMPTY
、VT_NULL
或数字类型,它只是将所有字段设置为零。
如果您不初始化 VARIANT
,类型是未定义的,它可能是前一个操作留在内存中的任何值。因此,您必须先在 VARIANT
.
VariantInit