c++ - COM,删除内存而不是调用 Release()

标签 c++ memory-leaks com release delete-operator

我对 COM 知之甚少,用 Google 搜索 COM somhow 根本找不到 COM(可能是因为它搜索的是 .com 地址)。

我们正在使用视频捕获硬件。它的 SDK 允许我们在捕获帧时注册回调。对象接口(interface)作为参数传递给该回调,我们可以通过查询该对象来获取大缓冲区地址(到捕获的帧像素)和其他信息。

现在看来,调用Release()并没有真正删除内存,而是减少了引用计数,当计数达到0时,它就被删除了,对吧?那么,对于上面提到的大缓冲区地址,使用“delete”关键字“删除”缓冲区怎么样?

似乎我们的程序(不是我写的,写程序的人退出了公司)将指向缓冲区的指针复制到某个类中,但从未在回调中调用任何 Release()。后来,缓冲区在类中被“删除”。似乎 Release()ing 框架接口(interface)对象也删除了缓冲区。但它们是一样的吗?

COM 以某种方式对引用进行计数,但如果用户的代码只是删除该内存会怎样?如果我的问题不清楚,我很抱歉。简而言之,删除从 COM 对象获取的缓冲区是否安全。

简化代码:可疑情况

void mycallback(IFrame f)
{
  char* buffer;
  f->GetBuffer(buffer);
  MyClass m(buffer);
  ...
}

MyClass::DeleteBuffer()
{
  delete m_buffer;
}

最佳答案

当代码将帧缓冲区内容复制到它自己的缓冲区时,没有什么特别的事情发生。帧缓冲区仍由 COM 代码拥有,代码自己的缓冲区仍由该代码拥有。不要不要删除 COM 缓冲区,这将在 COM 代码删除它时调用未定义的行为。如果您首先调用了 AddRef(),您应该只在 COM 接口(interface)指针上调用 Release()。在这种情况下,COM 代码在调用回调之前调用了 AddRef()。 Release() 调用将在回调返回后进行。

在回调中看到帧被复制是很正常的,帧缓冲区通常只在回调期间保持有效。所以以后要用的话一定要复制过来。

如果您正在追踪内存泄漏,那么这不太可能是罪魁祸首。如果帧缓冲区上存在引用计数问题,则程序在耗尽所有可用内存之前不会持续超过一分钟。

关于c++ - COM,删除内存而不是调用 Release(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13153408/

相关文章:

java - 在最近的 JVM 中,不可见的引用仍然是一个问题吗?

c# - DoEvents 与其他任何东西 --> 对于长时间的 COM 操作

c++ - 使用 uncaught_exception 处理错误情况

c++ - 如何在我的 DLL 中调用我的 exe 中定义的函数?

java - Java 中可能存在内存泄漏吗?

c# - 为什么以及何时应该让我的程序集对 Com Components 可见?

c# - 无法在 UWP 中获取 ColumnDefinitionCollection 的 "Add"方法

c++ - 如何extern一个全局二维数组?

c++ - 将字符串作为字节序列写入文件

ios - 这个简短方法中的内存泄漏