[英]CXX0030: Error: expression cannot be evaluated
簡短的問題:
為什么在析構函數中的IWICImagingFactory對象的“本地”窗口中看到此消息?
詳細的解釋:
我在CreateDeviceIndependentResources()函數中創建了一個IWICImagingFactory對象:
if (SUCCEEDED(hr))
{
hr = CoCreateInstance(
CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&mpWICFactory)
);
}
我已經檢查了小時之后,它始終是S_OK。
然后在我的CreateDeviceResources()函數中,在對LoadBitmapFromFile()的調用中將指針傳遞給IWICImagingFactory對象:
if(SUCCEEDED(hr))
{
hr = LoadBitmapFromFile(
mpRenderTarget,
mpWICFactory,
L".\\background.png",
0,
0,
&mpBackgroundBitmap);
}
函數LoadBitmapFromFile與MSDN示例中顯示的完全相同。 您可以在這里看到大多數代碼: http : //msdn.microsoft.com/zh-cn/library/dd756686%28v=VS.85%29.aspx
LoadBitmapFromFile()的返回代碼為S_OK。 我現在有一個工作正常的ID2D1Bitmap對象。
我沒有將WIC工廠用於其他任何用途。 當我嘗試對WIC工廠進行SafeRelease()時,析構函數中會出現問題:
SafeRelease(&mpWICFactory);
SafeRelease()定義為:
template<class Interface>
inline void SafeRelease(Interface** ppInterfaceToRelease)
{
if(*ppInterfaceToRelease != NULL)
{
(*ppInterfaceToRelease)->Release();
(*ppInterfaceToRelease) = NULL;
}
}
在析構函數中,如果在“本地”窗口中展開mpWICFactory對象,則會看到“ CXX0030:錯誤:無法評估表達式”錯誤。 下面的屏幕截圖顯示了在WICFactory對象上調用SafeRelease()之前的Locals窗口。
http://img21.imageshack.us/img21/9820/localsy.jpg
然后,我得到一個錯誤:Program.exe中0x00d22395的未處理異常:0xC0000005:訪問沖突讀取位置0x6df128f0。
這個問題是什么原因造成的?
編輯:這是一個演示問題的完整簡單程序:
Test.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
TEST.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;
}
Main.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()
,看看它是否有效。
另外,請嘗試顯式調用清除操作(使用某種uninitialize函數),而不要在析構函數中執行此操作。 當您將清理工作留給析構函數時,有時您無法完全控制清理時間。
也可能是您以錯誤的順序銷毀了一些依賴對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.