我的情景如下:
在调用函数::
中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中访问它的方式有误。
答案 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指针到任意数组的数组。