- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
代码如下:
struct lex_compare {
bool operator() (const weak_ptr<int> &lhs, const weak_ptr<int> &rhs)const {
return *lhs.lock() < *rhs.lock();
}
};
int main(){
set<weak_ptr<int>,lex_compare> intset;
intset.insert(make_shared<int>(1));
cout << "intset size:" << intset.size() << endl; //1
cout << "Does 1 exist?"<< intset.count(make_shared<int>(1))<<endl; // failed
}
我想知道如何count/find
weak_ptr<int>
存储在 intset
是否有更好的方法可以完成同样的工作?
最佳答案
您不能将临时 shared_ptr 插入弱指针集,因为从这个存储的弱指针指向已删除的内存的意义上讲,这是内存泄漏。
intset.insert(make_shared<int>(1));
// after this instruction shared_ptr destructor frees the memory
这就是为什么您无法在集合中找到它的原因 - 因为 *lhs.lock()
UB 在吗?
参见 weak_ptr::lock doc .
您需要以这种方式制作 òrder 运算符:
struct lex_compare {
bool operator() (const weak_ptr<int> &lhs, const weak_ptr<int> &rhs)const {
auto lptr = lhs.lock(), rptr = rhs.lock();
if (!rptr) return false; // nothing after expired pointer
if (!lptr) return true; // every not expired after expired pointer
return *lptr < *rptr;
}
};
这意味着 - 你需要有这个 shared_ptr sowmewhere 来计算它:
int main(){
set<weak_ptr<int>,lex_compare> intset;
auto shared1 = make_shared<int>(1);
intset.insert(shared1);
cout << "intset size:" << intset.size() << endl; //1
cout << "Does 1 exist?"<< intset.count(make_shared<int>(1))<<endl; // failed
}
有了上面的内容 - 你的计数就可以了。
还考虑将 shared_ptr 保留在集合中...
[更新]
marko 在评论中指出了有效的问题。 std::weak_ptr 根本不能以您使用它的方式用作键。只有当你能确保指向的值永远不会改变或者指针本身永远不会过期时。看这个例子:
set<weak_ptr<int>,lex_compare> intset;
auto shared1 = make_shared<int>(1);
intset.insert(shared1);
cout << "Does 1 exist?"<< intset.count(make_shared<int>(1))<<endl; // works
shared1.reset();
cout << "Does 1 exist?"<< intset.count(make_shared<int>(1))<<endl; // failed
另一个例子:
set<weak_ptr<int>,lex_compare> intset;
auto shared1 = make_shared<int>(1);
intset.insert(shared1);
cout << "Does 1 exist?"<< intset.count(make_shared<int>(1))<<endl; // works
*shared1 = 2;
cout << "Does 1 exist?"<< intset.count(make_shared<int>(1))<<endl; // failed
您可以保留 std::shared_ptr 以防止指针超出集合过期 - 并且 std::shared_ptr 具有 operator <
- 但这个运算符比较指针本身 - 而不是指向的值 - 所以更好的是 std::set<std::shared_ptr<int>>
- 但最好的是 std::set<int>
或更改std::set<...>
--> std::vector<std::weak_ptr<int>>
- 并使用 count_if
-- 参见:
vector<weak_ptr<int>> intset;
auto shared1 = make_shared<int>(1);
intset.push_back(shared1);
cout << "Does 1 exist?"<< count_if(begin(intset), end(intset),
[](auto&& elem)
{
auto ptr = elem.lock();
return ptr && *ptr == 1;
});
或用std::set<std::shared_ptr<int>>
:
set<shared_ptr<int>> intset;
auto shared1 = make_shared<int>(1);
intset.insert(shared1);
// if you can ensure shared1 value will not change:
cout << "Does 1 exist?"<< intset.count(shared1);
// if not - use count_if - the slower than std::count
cout << "Does 1 exist?"<< count_if(begin(intset), end(intset),
[](auto&& ptr)
{
return ptr && *ptr == 1;
});
关于c++ - 一组 weak_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32668742/
我有以下数据结构: shared_ptr>> foo; 还有一个带有函数的渲染器类: void addObject(weak_ptr _obj) const 这个函数只是将_obj推回 mutable
我了解可用的方法以及它们是什么。请描述 weak_ptr 类的私有(private)部分或给出一些自定义 weak_ptr 代码的示例。我无法通过 std::weak_ptr 实现来理解。 最佳答案
我目前有类似以下内容: class Parent { //just a single child... for sake of simplicity //no other class
以下是 weak_ptr 的 2 个构造函数: http://msdn.microsoft.com/en-us/library/bb982126.aspx weak_ptr(const weak_pt
我有一个类将 weak_ptr 存储在一个容器中,如果 weak_ptr 没有过期,稍后会做一些事情: class Example { public: void fill(std::share
代码如下: struct lex_compare { bool operator() (const weak_ptr &lhs, const weak_ptr &rhs)const {
我想将原始指针成员包装到一些智能指针,以防止在开发类中删除。指针下对象的所有者在类之外。所以,看起来像 boost::shared_ptr 和 std::auto_ptr 不适合。以下是简化的示例:
考虑以下代码: #include #include using namespace std; struct MySharedStruct { int i; }; void print_valu
我了解如何使用 weak_ptr 和 shared_ptr。通过计算对象中的引用数,我了解 shared_ptr 的工作原理。 weak_ptr 是如何工作的?我尝试通读 boost 源代码,但我对
我目前正在为游戏设计一个对象结构,在我的例子中,最自然的组织变成了一棵树。作为智能指针的忠实粉丝,我只使用 shared_ptr 的。然而,在这种情况下,树中的子节点需要访问它的父节点(例如—— ma
根据 [util.smartptr.weak.obs]/4 ,weak_ptr::owner_before 严格弱排序是这样的:“两个 shared_ptr 或 weak_ptr 实例是等价的,当且仅
我正在做一个练习来了解共享指针和弱指针。 所以这个例子是shared_ptr的循环依赖,我该如何解决weak_ptr的问题。 我想将 root->left->parent 初始化为 root,对于右节
看看 std::weak_ptr 我在几个地方看到它可以用来打破由于使用 std::shared_ptr 的循环依赖导致的内存泄漏>。例如,请参见这两个已接受的答案:[1] , [2] . 采用最后引
在我的程序中,Groups 将共享指向 Subjects 的指针;并且 Subjects 将有指向其 Groups 的弱指针。我希望 Group 有一个 join() 函数,将 Subject 的弱指
假设我有一个包含子对象的 shared_ptr 的对象。 我希望子对象有一个指向父对象的 weak_ptr,子对象的构造函数应该是什么样子,我应该如何从父对象构造一个子对象? 提前致谢 最佳答案 由于
序言 在 C++11 中有 std::shared_ptr + std::weak_ptr 组合。尽管非常有用,但它有一个讨厌的问题:你 cannot easily construct shared_
我认为我的问题类似于 shared_ptr and weak_ptr differences ,但我感兴趣的是了解它们如何协同工作,而不是查看差异列表。 维基百科页面 shared_ptr and w
取消引用 weak_ptr 不会自动检查指针是否已过期。为什么要这样设计? 我想安全地取消对弱指针的引用,而不必首先使用 expired() 检查它们,如果它们为空则抛出异常。 这是一个好的做法吗?什
我正在尝试重写我们的 Observer/Observable 实现以使用 std::shared_ptr/std::weak_ptr 来摆脱代码中当前存在的一些讨厌的竞争条件。 通常,观察者会在满足某
我有一个带有自定义删除器的 boost::shared_ptr。将其转换为 weak_ptr 时删除者信息丢失了吗?如果是,我如何将相同的删除器重新附加到 shared_ptr - 从 weak_pt
我是一名优秀的程序员,十分优秀!