CXX0030:错误:无法计算表达式

CXX0030: Error: expression cannot be evaluated

本文关键字:计算 表达式 错误 CXX0030      更新时间:2023-10-16

简短问题:

为什么我在析构函数中的IWICImagingFactory对象的Locals窗口中看到这个

详细解释:

我正在CreateDeviceIndependentResources((函数中创建IWICImagingFactory对象:

if (SUCCEEDED(hr))
{
    hr = CoCreateInstance(
        CLSID_WICImagingFactory,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_PPV_ARGS(&mpWICFactory)
        );
}

在此之后,我检查了hr,它总是S_OK。

然后,在我的CreateDeviceResources((函数中,我在对LoadBitmapFromFile((的调用中传递一个指向IWICImagingFactory对象的指针:

    if(SUCCEEDED(hr))
    {
        hr = LoadBitmapFromFile(
            mpRenderTarget,
            mpWICFactory,
            L".\background.png",
            0,
            0,
            &mpBackgroundBitmap);
    }

LoadBitmapFromFile函数与MSDN示例中显示的完全相同。您可以在此处查看大部分代码:http://msdn.microsoft.com/en-us/library/dd756686%28v=VS.85%29.aspx

LoadBitmapFromFile((的返回代码为S_OK。我现在有一个ID2D1Bitmap对象,它工作得很好。

我不使用WIC工厂做任何其他事情。当我尝试安全释放((WIC工厂时,问题发生在我的析构函数中:

SafeRelease(&mpWICFactory);

SafeRelease((定义为:

template<class Interface>
inline void SafeRelease(Interface** ppInterfaceToRelease)
{
if(*ppInterfaceToRelease != NULL)
{
    (*ppInterfaceToRelease)->Release();
    (*ppInterfaceToRelease) = NULL;
}
}

在析构函数中,如果我在Locals窗口中展开mpWICFactory对象,我会看到"CXX0030:Error:expression cannot be evaluated"错误。下面的屏幕截图显示了在对WICFactory对象调用SafeRelease((之前的Locals窗口。

http://img21.imageshack.us/img21/9820/localsy.jpg

然后我得到一个错误:Program.exe中0x00d22395处未处理的异常:0xC0000005:读取位置0x6df128f0时发生访问冲突。

这个问题的原因是什么?

编辑:这里有一个完整的简单程序来演示这个问题:

测试.h

#ifndef TEST_H
#define TEST_H
#include <Windows.h>
#include <wincodec.h>
#include <d2d1.h>
class Test
{
public:
IWICImagingFactory *mpWICFactory;
Test();
~Test();
HRESULT Init();
};
template<class Interface>
inline void SafeRelease(Interface** ppInterfaceToRelease)
{
if(*ppInterfaceToRelease != NULL)
{
    (*ppInterfaceToRelease)->Release();
    (*ppInterfaceToRelease) = NULL;
}
}
#endif

测试.cpp

#include "Test.h"
Test::Test() : mpWICFactory(NULL)
{
}
Test::~Test()
{
SafeRelease(&mpWICFactory);
}
HRESULT Test::Init()
{
   HRESULT hr = CoCreateInstance(
        CLSID_WICImagingFactory,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_PPV_ARGS(&mpWICFactory)
        );
   return hr;
}

主要.cpp

#include <Windows.h>
#include "Test.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance,
               PSTR cmdLine, int showCmd)
{
if(SUCCEEDED(CoInitialize(NULL)))
{
    Test app;
    app.Init();
    CoUninitialize();
}
return 0;
}

简短的答案是虚拟函数指针0x6df128e8无效,因此调试器无法取消引用它。这就是"表达式无法求值"的含义。

因此,当程序稍后尝试调用其中一个虚拟函数时,指针仍然不起作用,并且会出现访问冲突。

长而硬的部分,如果发现对象被无效值覆盖的确切位置。不幸的是,它几乎可以在程序中的任何其他地方。。。

尝试在初始化后立即调用SafeRelease(),看看它是否有效。

此外,请尝试显式调用cleanup(使用某种未初始化的函数(,而不是在析构函数中执行此操作。当你把清理工作交给析构函数时,有时你无法完全控制何时清理什么。

也可能是你以错误的顺序破坏了一些依赖对象。