我很难在UWP的C ++ / CX代码中正确释放用The Key you want is : VgC4b9K-gYU
方法锁定的BitmapBuffer
。
基本代码如下所示(它是来自Microsoft的OpenCV网桥示例here。
SoftwareBitmap.LockBuffer()
然后使用此缓冲区(bool OpenCVHelper::GetPointerToPixelData(SoftwareBitmap^ bitmap, unsigned char** pPixelData, unsigned int* capacity)
{
BitmapBuffer^ bmpBuffer = bitmap->LockBuffer(BitmapBufferAccessMode::ReadWrite);
IMemoryBufferReference^ reference = bmpBuffer->CreateReference();
ComPtr<IMemoryBufferByteAccess> pBufferByteAccess;
if ((reinterpret_cast<IInspectable*>(reference)->QueryInterface(IID_PPV_ARGS(&pBufferByteAccess))) != S_OK)
{
return false;
}
if (pBufferByteAccess->GetBuffer(pPixelData, capacity) != S_OK)
{
return false;
}
return true;
}
)初始化pPixelData
对象(浅拷贝)。并且永远不会被释放。
对同一cv:Mat
个对象的LockBuffer()
连续调用会引发异常:
Platform :: AccessDeniedException ^在内存位置0x00000002CEEFDCC0。 HRESULT:0x80070005访问被拒绝。 WinRT信息:采用位图共享锁
如何正确释放此缓冲区?特别是在C ++ / CX?
我试图保留引用以在不再需要时释放它。在C ++ / CX中Dispose()或Close()方法是不可访问的,编译器建议改为调用析构函数:
SoftwareBitmap
但它不起作用(什么都不做)。正在调用析构函数,但另一次调用LockBuffer()会引发与以前相同的错误。
答案 0 :(得分:1)
如何从SoftwareBitmap(UWP)正确释放BitmapBuffer?
在BitmapBuffer
和IMemoryBufferReference
完成工作后,可以通过调用delete
表达式来关闭这些对象。更多详情请查看Destructors。例如:
SoftwareBitmap^ bitmap = ref new SoftwareBitmap(
BitmapPixelFormat::Bgra8,
100,
200,
BitmapAlphaMode::Premultiplied);
BitmapBuffer^ bmpBuffer = bitmap->LockBuffer(BitmapBufferAccessMode::ReadWrite);
IMemoryBufferReference^ reference = bmpBuffer->CreateReference();
delete reference;
delete bmpBuffer;
BitmapBuffer^ bmpBuffer2 = bitmap->LockBuffer(BitmapBufferAccessMode::ReadWrite);
如上面的代码片段所示,在删除BitmapBuffer
对象后,您可以再次成功锁定缓冲区。