我对 COM 知之甚少,在 Google 中搜索 COM somhow 根本没有找到 COM(可能是因为它搜索的是 .com 地址)。
我们正在使用视频捕获硬件。它的 SDK 允许我们在捕获帧时注册回调。对象接口作为参数传递给该回调,我们可以通过查询该对象来获取大缓冲区地址(到捕获的帧像素)和其他信息。
现在看来,调用Release()实际上并没有删除内存,而是减少了引用计数,当计数达到0时,它被删除了,对吧?那么,关于上面提到的那个大缓冲区地址,使用“delete”关键字“删除”缓冲区怎么样?
似乎我们的程序(不是我写的,编写程序的人退出了公司)将指向缓冲区的指针复制到某个类中,但从未在回调中调用任何 Release()。后来,缓冲区在类中被“删除”。似乎 Release()ing 框架接口对象也删除了缓冲区。但它们是一样的吗?
COM 以某种方式计算引用,但如果用户的代码只是删除该内存会发生什么?如果我的问题含糊不清,我很抱歉。简而言之,删除从 COM 对象获取的缓冲区是否安全。
简化代码:可疑情况
void mycallback(IFrame f)
{
char* buffer;
f->GetBuffer(buffer);
MyClass m(buffer);
...
}
MyClass::DeleteBuffer()
{
delete m_buffer;
}