如何解决无法使std :: reference_wrapper与std :: unique_ptr一起使用
我有一个object pool,它在std::unique_ptr<T>
中保存对象。
与大多数池一样,该池保存着创建成本很高的对象,但是一旦借用了一个对象,就无法防止将具有相同设置的对象添加到该池中,因此我想对其进行扩展以防止这种情况发生。
我看到3种选择:
-
将
std::unique_ptr<T>
替换为std::shared_ptr<T>
,但没有计划使用多线程代码,这违反了所有权约定-池不应该仅仅为了读取其属性之一而拥有对象。 / p> -
在池
std::vector
中保留T属性的副本,并在从池中借来并返回池std::unique_ptr<T>
时添加和删除。易于实现,但是在复制数据时感觉不对。 -
使用
std::vector<std::reference_wrapper<std::unique_ptr<T>>>
。通过保留对借用的std::unique_ptr<T>
的引用,我可以访问其属性,并且可以轻松地防止创建具有相同设置的对象。
我目前正在尝试实现3,但是在如何将对std::unique_ptr<T>
的引用中添加到std::vector<std::reference_wrapper<std::unique_ptr<T>>>
上感到困惑。这有可能吗?
解决方法
参考版本很糟糕-因为一旦unique_ptr被移动,参考包装就失效了。您最好只存储原始指针。但是在这种情况下,它不会知道它是否被销毁。您可以使用自定义析构函数使WTSSendMessageW
标记池中的对象已被破坏。
此外,我相信您的逻辑有些混乱。如果池包含unique_ptr
并且不能创建具有相同设置的对象,则它应该拥有所有对象并处理指向用户的原始/观察者指针。您只需要编写一个例程来检查该对象当前是否正在使用和不可访问。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。