在VC ++中使用跨指针的双指针进行操作

时间:2012-06-05 16:42:46

标签: c++ visual-c++ pointers nullpointerexception

我的情景如下:

在调用函数::

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仍然为null。当我在海浪上调用LockRect()时它会抛出异常,如下所示。

hr = surf->LockRect(, , );  

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

2 个答案:

答案 0 :(得分:1)

您的代码充满了错误和错误 - 除了陈述的问题之外,它还表现出异常的不安全和DRY违规以及内存泄漏。确切地说,问题在于您没有意识到指针和值之间的区别。当您分配到surfReceive时,您只是擦除原始值并且永远不会返回新值。此外,您将稍后将 fun 删除。

你可以告诉它永远不会工作,因为你试图返回指向函数调用者期望常规指针的指针数组的指针。

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

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。

答案 1 :(得分:0)

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

您将Func指针传递给已经分配(在堆栈上)指向任何内容的指针。在Func内,您重新分配您的参数(这是指向已分配指针的指针)到您刚刚已分配的地址(在堆上)。

我要说在surfReceive的电话中不要分配任何内容,只需CreateOffscreenPlainSurface。要访问指针,只需使用*surfReceive

但是,由于我不理解的原因,你分配了一个10指针到任意数组的数组。