CXX0030:错误:无法计算表达式
CXX0030: Error: expression cannot be evaluated
简短问题:
为什么我在析构函数中的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(使用某种未初始化的函数(,而不是在析构函数中执行此操作。当你把清理工作交给析构函数时,有时你无法完全控制何时清理什么。
也可能是你以错误的顺序破坏了一些依赖对象。
- (C++)分析树以计算返回错误值的简单算术表达式
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 编译器是否强制根据模板参数计算表达式?
- 为什么'typeid(x) == typeid(y)'的计算结果为 true,其中 'x' 和 'y' 分别是 T 和 T& 类型的 id-表达式?
- 如何在常量计算表达式中获取编译时错误?
- 计算表达式字符串由 std::map 中的键组成
- GDB 如何在运行时计算C++表达式
- 从C++调用 Python 或 Lua 来计算表达式,仅在需要时计算未知变量
- 错误指针:解析令牌时无法计算表达式
- 在c++lldb中使用重载运算符计算表达式
- 在不使用函数 pow 的情况下计算表达式的总和
- 使用 std::map<std::string, int> 计算表达式树
- 我怎么知道编译器是否C++编译时计算表达式
- BSTR bstrRtf = 0xcccccccccccccccc <调试时错误 Ptr>( = CXX0030:错误:无法计算表达式)
- 正在计算表达式C++
- CXX0030:错误:无法计算表达式
- 计算表达式
- 为什么c++应用程序可能不正确地计算表达式
- char*中的C++错误PTR(无法计算表达式)