簡體   English   中英

CXX0030:錯誤:無法計算表達式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM