在 COM 对象上使用 std::map?

Posted

技术标签:

【中文标题】在 COM 对象上使用 std::map?【英文标题】:Using std::map on COM objects? 【发布时间】:2012-01-27 18:05:54 【问题描述】:

我正在尝试创建 COM 对象到特定哈希的映射,例如字符串的映射。这是我正在实现的缓存算法。这个想法是,如果您尝试加载已由前一行代码打开的文件,它将以 IStream 的形式返回已创建的内存块,而无需费心将文件重新加载到内存中。我遇到的一个问题是当 COM 对象的最后一个引用被删除时,它们会自动销毁它们自己。原始容器不知道对象已被销毁,并且当您访问已释放的对象时,它会返回无效的内存句柄而不是加载文件。有没有更好的方法来实现这一点,还是我应该放弃 STL 而是制作自己的容器?

【问题讨论】:

在地图中使用指向 COM 对象的智能指针。这样,它将保留一个引用,直到不再需要它,以防止它被过早删除。 【参考方案1】:

这是一个错误,将接口指针放入容器的代码忘记调用 AddRef()。 永远不要在不增加引用计数的情况下存储指向 COM 接口的指针。

【讨论】:

容器没有忘记调用 AddRef,它从一开始就没有设计为这样做。在将其添加到容器之前自己调用 AddRef,或者使用智能指针 - Microsoft 提供了 2 个可供选择。 我最终为可以包含 COM 对象的容器编写了自己的算法。这似乎比重写大部分代码库更简单。

以上是关于在 COM 对象上使用 std::map?的主要内容,如果未能解决你的问题,请参考以下文章

锁定 std::map C++

c++11 使用 std::map 作为返回值

使用std shared_ptr作为std :: map键

将 SWIG 与 C++ 的 std::map 一起使用时,Java 没有迭代器

将 std::map 对象传递给线程

std::map 上可能的线程不安全操作