在 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?的主要内容,如果未能解决你的问题,请参考以下文章