在尝试获取共享指针的删除时,我发现了一个非常奇怪的行为。这是有问题的代码:
shared_ptr<IDeckLinkVideoFrame> videoFrame = deckLinkDevice_->GetVideoFrame(decklinkFourCC_);
if(std::get_deleter<ComObjectDeleter<IDeckLinkVideoFrame>>(videoFrame))
{
// never gets here
}
我从未进入 if ,因为 get_deleter()返回 NULL 。在函数 GetVideoFrame()中,我使用删除器创建 shared_ptr ,如下所示:
shared_ptr<IDeckLinkVideoFrame> DeckLinkDevice::GetVideoFrame(FourCC frameFourCC)
{
BMDPixelFormat pixelFormat = FourCCToBMDPixelFormat(frameFourCC);
shared_ptr<IDeckLinkVideoFrame> frame;
IDeckLinkMutableVideoFrame* videoFrame = NULL;
long rowBytes = 0;
BMDFrameFlags flags = 0;
switch (pixelFormat)
{
case bmdFormat8BitBGRA:
rowBytes = outputMode_->width_ * 4;
flags = bmdFrameFlagFlipVertical;
break;
case bmdFormat8BitYUV:
rowBytes = outputMode_->width_ * 2;
flags = bmdFrameFlagDefault;
break;
default:
break;
}
if (rowBytes == 0)
{
MODULE_ERRORF("Pixel format %1 is not supprted") << pixelFormat;
}
else if (CreateVideoFrame(outputMode_->width_, outputMode_->height_, rowBytes, pixelFormat, flags, &videoFrame) != S_OK)
{
MODULE_ERRORF("Failed to obtain a frame from the output.");
}
else
{
frame.reset(videoFrame, ComObjectDeleter<IDeckLinkVideoFrame>());
}
if(std::get_deleter<ComObjectDeleter<IDeckLinkVideoFrame>>(frame))
{
// here it works I can get the deleter
}
return frame;
如果我尝试在此函数中调用 get_deleter(),则可以正常工作。因此,当函数 GetVideoFrame()返回时,看起来删除器会丢失...任何想法会发生什么以及如何解决它?
感谢。