当前位置: 首页 > 知识库问答 >
问题:

C绑定到weak_ptr不工作

厍胤运
2023-03-14

我有一个简单的测试,我试图将一个弱ptr参数绑定到一个接受弱ptr的全局函数,并在支持指针仍然有效的情况下调用一个方法。

当我用弱指针创建lambda时,这似乎是有效的。如果我用weak_ptr直接调用全局方法,它也可以工作。但是,如果我事先将全局函数绑定到weak_ptr,它似乎不起作用。下面的淡化代码说明了这个问题。

我一定错过了一些简单的东西。有什么线索吗?

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

using namespace std;

class MyValue : public enable_shared_from_this<MyValue>
{
    public:
        MyValue (int i)
        {
            value = i;
        }

        ~MyValue()
        {
        }

        int getValue() { return value; }

        void printValue() { cout << value << endl; }

    private:

        int value;
};

void callWeakFunction (weak_ptr<MyValue> weakValue)
{
    shared_ptr<MyValue> strongPtr = weakValue.lock();

    if (strongPtr)
    {
        strongPtr->printValue();
    }
    else
    {
        cout << "Sorry, your backing pointer is gone" << endl;
    }
}

int main()
{
    weak_ptr<MyValue> weakValue;

    // Try binding a global function to the weak pointer, doesn't seem to work
    function<void()> weakPrintValue = bind(callWeakFunction, weakValue);

#if 0
    // Create a lambda - this works fine
    function<void()> weakPrintValue ([&weakValue]()
                       {
                           shared_ptr<MyValue> ptr = weakValue.lock();
                           if(ptr)
                           {
                               ptr->printValue();
                           }
                           else
                           {
                               cout << "Sorry, backing pointer is gone" << endl;
                           }
                       });
#endif

    {
        shared_ptr<MyValue> value = make_shared<MyValue>(7);

        weakValue = value;

        // Backing pointer is present
        weakPrintValue();    // This does not work, but callWeakFunction (weakValue) works fine
    }

    // No backing pointer
    weakPrintValue();
}

结果输出:

Sorry, your backing pointer is gone
Sorry, your backing pointer is gone

期望第一个weakPrintValue打印该值(7)

共有3个答案

钮安歌
2023-03-14

我相信bind()可以按值捕获weakValue。它返回具有自己的weakValue副本的结果对象。更改本地weakValue时,它不会影响bind()返回的对象内部的副本。

徐承载
2023-03-14

我不希望这两个都能起作用。在这两种情况下,当弱值为空时,您都在捕获它的初始值。要受后续分配的影响,您需要改为通过引用捕获。因此,在lambda中,您需要[

bind(callWeakFunction, cref(weakValue));

蓟安歌
2023-03-14

我认为您需要将弱的\u ptr封装在ref()中,以便惰性地对其进行评估:

function<void()> weakPrintValue = bind(callWeakFunction, ref(weakValue));
 类似资料:
  • 我在写一个函数,需要返回多个变量,其中一个是位集。然后我遇到了一些奇怪的编译错误。 我尝试了不同的编译器,它们都会产生错误,尽管消息不同。 我试着googling了一下,似乎和公共和私有继承有关。但我认为它不应该以任何方式影响这段代码。 简化代码(C 17)如下所示: 如果我移除方括号(即移除结构化绑定并使用普通自动),它就会工作。 错误消息如下: source.cpp:在函数int main()

  • 弱指针(weak pointer)经常被解释为用来打破使用shared_ptr管理的数据结构中循环(?)。但是我认为,将weak_ptr看成是指向具有下列特征的对象的指针更好一些。 只有当对象存在的时候,你才需要对其进行访问 并且它可能被其他人删除释放 并且在最后一次使用之后调用其析构函数(通常用于释放那些不具名的内存(anon-memory)资源 (译注:weak_ptr可以保存一个“弱引用”,

  • 头文件: "boost/weak_ptr.hpp" weak_ptr 是 shared_ptr 的观察员。它不会干扰shared_ptr所共享的所有权。当一个被weak_ptr所观察的 shared_ptr 要释放它的资源时,它会把相关的 weak_ptr的指针设为空。这防止了 weak_ptr 持有悬空的指针。你为什么会需要 weak_ptr? 许多情况下,你需要旁观或使用一个共享资源,但不接受

  • 我已经创建了一个绑定适配器来显示毕加索的图片,但它不工作。我有以下错误: 发现数据绑定错误。****/数据绑定错误****Msg:在Android.Widget.ImageView上找不到参数类型为java.lang.String的属性'app:loadPicture'的设置器。文件:/home/groupevsc.com/mathieu_labar/documents/projects/andr

  • 最后重要的一点是,我要创建的这些节点本身可能有几个属性。因此,为了保持上面的例子,它可能是每个作者的出生日期和地点列出。 任何建议都很感激。

  • Go版本:1.7.5 GOPATH=D:/GoWork React本机版本0.41 下面的代码是位于D:\GoWork\src\rngo\rngo\rngo的绑定go包。去 非常简单,只返回一个字符串 从运行以下命令 下面的详细输出似乎很好 写C:\用户\薄荷\AppData\本地\Temp\gommobive-work-855641675\gomobile_bind\classes.go 编写C