Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 弱ptr函数绑定?知道弱ptr何时过期?_C++_Stdbind_Weak Ptr - Fatal编程技术网

C++ 弱ptr函数绑定?知道弱ptr何时过期?

C++ 弱ptr函数绑定?知道弱ptr何时过期?,c++,stdbind,weak-ptr,C++,Stdbind,Weak Ptr,我需要一些帮助和解释,我有点困惑:( 我有一个“弱”管理器,用于保存程序中其他对象的弱ptr。我想知道弱ptr在过期时何时过期(即它指向的共享ptr,销毁项目) 我浏览了一些关于弱\u ptr绑定的互联网站,但我对所有这些都有点困惑,因此希望能得到任何帮助。我找到了这个答案(h),但我并不真正理解它,因为我在std::bind方面做得不多。这在弱\u ptr中是如何工作的?如果我将一个函数绑定到它,该函数是否会在弱\u ptr发生任何事情时被调用 基本上我有这样的东西: #include <

我需要一些帮助和解释,我有点困惑:(

我有一个“弱”管理器,用于保存程序中其他对象的
弱ptr
。我想知道
弱ptr
在过期时何时过期(即它指向的
共享ptr
,销毁项目)

我浏览了一些关于
弱\u ptr
绑定的互联网站,但我对所有这些都有点困惑,因此希望能得到任何帮助。我找到了这个答案(h),但我并不真正理解它,因为我在
std::bind
方面做得不多。这在
弱\u ptr
中是如何工作的?如果我将一个函数绑定到它,该函数是否会在弱\u ptr发生任何事情时被调用

基本上我有这样的东西:

#include <iostream>
#include <list>
#include <memory>
#include <functional>
#include <algorithm>

struct Obj {};

class weakManager
{
public:
    unsigned int addItem(std::shared_ptr<Obj>& item)
    {
        items_.push_back(std::weak_ptr<Obj>(item));
        return items_.size() - 1;
    }

    void addObserver(std::function<void(unsigned int ID)> observer)
    {
        obsevers_.push_back(observer);
    }

    unsigned int getValidItems()
    {
        unsigned int validItems = 0;
        std::for_each(items_.begin(), items_.end(), [&validItems](std::weak_ptr<Obj>& item) 
            {
                if (!item.expired())
                    ++validItems;
            });
        return validItems;
    }

private:
    std::list<std::weak_ptr<Obj>> items_;
    std::list<std::function<void(unsigned int ID)>> obsevers_;
};


int main(int argc, const char * argv[]) 
{
    weakManager manager;

    manager.addObserver([](unsigned int ID) 
        {
            std::cout << "Observer says, item " << ID << " expired...\n";
        });

    {
        std::shared_ptr<Obj> someItem(new Obj);
        std::cout << "Item with ID : " << manager.addItem(someItem) << " added.\n";

        std::cout << "Manager has " << manager.getValidItems() << " valid item(s).\n";
    }
    std::cout << "Manager has " << manager.getValidItems() << " valid item(s).\n";

    return 0;
}
#包括
#包括
#包括
#包括
#包括
结构Obj{};
类弱管理器
{
公众:
未签名的int addItem(std::shared_ptr&item)
{
项目推回(标准:弱项目);
返回项目大小()-1;
}
void addObserver(std::function observer)
{
观察者向后推(观察者);
}
无符号整型getValidItems()
{
无符号整数validItems=0;
std::for_each(items_u.begin()、items_u.end()、[&validItems](std::weak_ptr&item)
{
如果(!item.expired())
++有效成分;
});
返回有效期;
}
私人:
std::列出项目;
std::列出观察者;
};
int main(int argc,const char*argv[]
{
弱经理人;
manager.addObserver([](未签名的int-ID)
{

std::您是否必须在
弱ptr
的orign
共享ptr
中将调用观察者添加到deleter中才能有这种行为OK谢谢,而不是仅仅遵循tbh。您是说我是否应该在管理器中持有
共享ptr
,并检查
共享ptr
的引用计数器何时达到1,即o管理器中的ne是唯一剩下的?而不是管理器中的弱ptr?干杯。不,我的意思是为您想要签出的
共享ptr
设置自定义删除器。删除器会在对象被删除(并且
弱ptr
无效)时调用观察者不,他是说你正在管理的任何东西的析构函数应该告诉经理它正在自我毁灭。好的,谢谢。我明白了,所以不可能让
弱的ptr
知道它们何时过期?这是否意味着
共享的ptr
最好在管理器中,而
弱的ptr
只被其他东西使用。de系统标志目前没有这样设置,因为
共享\u ptr
所有者只是创建
共享\u ptr
对象,并且可以或不可以将它们添加到管理器中供其他人潜在使用。这是否意味着当所有者创建资源时,它已经需要知道它是否将被弱管理者使用?问题在于人ager不知道它什么时候有一件过时的东西(