0

我的场景如下:

在调用者函数中::

IDirect3DSurface9 * surf = null;
Func(&surf);
hr = surf->LockRect(, , );  // THROWS an EXCEPTION BCOZ "surf" is still null. Dont know why ??

在 CALLED 函数中:

Func(IDirect3DSurface9 **surfReceive)
{
   surfReceive= new IDirect3DSurface9*[10];
  IDirect3DSurface9* surfcreate = NULL;

        hr = xyz->CreateOffscreenPlainSurface(  width, 
                                                            height, 
                                                            formt, 
                                                            D3DPOOL_DEFAULT, 
                                                            &surfcreate, 
                                                            NULL);
        if (FAILED(hr)) 
            return hr;

        surfReceive[0] = surfcreate;
}

我的疑问是,在 CALLER 中(如我在上面的代码中所示),即使在调用者返回后,surf 仍然为空。当我在冲浪上调用 LockRect() 时,它会引发异常,如下所示。

hr = surf->LockRect(, , );  

重要的是要注意“CreateOffscreenPlainSurface()”调用返回成功,并且“surfcreate”存储了正确的值,因此 surfReceive[0] 也存储了正确的值。但我认为我在 CALLER 中访问它的方式出错了。

4

2 回答 2

1

您的代码充满了错误和错误——除了所述问题之外,它还表现出异常不安全、DRY 违规和内存泄漏。确切地说,问题在于您不知道指针和值之间的区别。当您分配给 时surfReceive,您只是清除了原始值,并且永远不会返回新值。此外,您稍后会很开心地删除它。

你可以说这永远行不通,因为你试图返回一个指向函数调用者期望常规指针的指针数组的指针。

使用基于类的代码,一次性获得清晰度、安全性和性能。

struct COMDeleter {
    template<typename T> void operator()(T* p) {
        p->Release();
    }
};
void CheckD3DResult(HRESULT hr) {
#ifdef _DEBUG
    if (FAILED(hr)) {
        __debugbreak();
    }
#endif
}
std::unique_ptr<IDirect3DSurface9, COMDeleter> Func() {
    IDirect3DSurface9* temp = nullptr;
    CheckD3DResult(xyz->CreateOffscreenPlainSurface(
        width, 
        height, 
        formt, 
        D3DPOOL_DEFAULT, 
        &temp, 
        NULL));
    return std::unique_ptr<IDirect3DSurface9, COMDeleter>(temp);
}
std::unique_ptr<IDirect3DSurface9, COMDeleter> surf = Func();
CheckD3DResult(surf->LockRect(...));

此代码尊重异常,保证内存清理,并且至少接近尊重 DRY。

于 2012-06-05T17:11:47.990 回答
0

我不确定您对 的期望是什么Func,但这绝对行不通。

您将Func一个指向分配(在堆栈上)的指针传递给任何指针。在内部Func,您将参数(指向已分配的指针的指针)重新分配给您刚刚分配的地址(在堆上)。

我会说不要分配任何东西,只是surfReceive在调用CreateOffscreenPlainSurface. 要访问指向任何内容的指针,只需使用*surfReceive.

但是,由于我不明白的原因,您分配了一个由 10 个指针组成的数组。

于 2012-06-05T17:12:17.320 回答