std::shared_ptr 与 std 容器

发布于 2024-10-20 18:52:18 字数 791 浏览 5 评论 0原文

我有一个 shared_ptr 容器,我将这些对象交给 Windows API,稍后我会使用原始 ptr 获得回调。我想在事后找到正确的shared_ptr。这可以用shared_ptr干净地完成吗? (不使用shared_from_this())。

非常基本的示例:

class CFoo
{
};
typedef std::shared_ptr<CFoo> CFooPtr;
typedef std::set<CFooPtr> CFooSet;

extern CFooSet m_gSet;
void SomeWindowsCallBack(CFoo* pRawPtr)
{
  m_gSet.erase(pRawPtr);
}

我知道可以使用 intrusive_ptr 非常轻松地完成此操作,但我很好奇是否有一种使用 shared_ptr 的方法。又名我正在寻找接受 RawPtr 和共享指针的容器来定位 shared_ptr 项。问题是我无法将 CFoo* 隐式转换为共享指针(出于我确实理解的原因)。

我想我可以做

m_gSet.erase(shared_ptr(pRawPtr, _do_not_delete_deleter))

但我还没有尝试过,它看起来很危险/丑陋。还有其他方法还是我基本上在寻找 intrusive_ptr ?谢谢

I have a container of shared_ptrs and I hand these objects off to a windows API and I get a callback later with the raw ptr. I want to locate the right shared_ptr after the fact. Can this be done with shared_ptr cleanly? (without using shared_from_this()).

very basic example:

class CFoo
{
};
typedef std::shared_ptr<CFoo> CFooPtr;
typedef std::set<CFooPtr> CFooSet;

extern CFooSet m_gSet;
void SomeWindowsCallBack(CFoo* pRawPtr)
{
  m_gSet.erase(pRawPtr);
}

I know that this can be done with intrusive_ptr very easily but I am curious if there is a way with shared_ptr. Aka I am looking for the container to accept the RawPtr and the shared_ptr for locating the shared_ptr item. The issue is that I can't implicitly cast the CFoo* into the shared_ptr (for reasons I do understand).

I was thinking I could do

m_gSet.erase(shared_ptr<CFoo>(pRawPtr, _do_not_delete_deleter))

but I have not tried that yet and it seems dangerous/ugly. Is there another way or am I basically looking for intrusive_ptr? Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

回首观望 2024-10-27 18:52:18

为什么不采用显而易见的方法呢?遍历容器,然后

if(iterator->get() == rawPointer)
   container.erase(iterator)

编辑:要利用 O(logN) 查找,您可以执行您想要的操作(即,使用 no_op 删除器创建一个共享指针)。它可能很丑陋,但并不危险

Why not the obvious way? Iterate through the container, and

if(iterator->get() == rawPointer)
   container.erase(iterator)

Edit: To utilize O(logN) lookup you can do what you want (that is, create a shared_ptr with no_op deleter). It may be ugly, but it's not dangerous

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文