我有一个简单的测试,我试图将一个弱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)
我相信bind()
可以按值捕获weakValue
。它返回具有自己的weakValue
副本的结果对象。更改本地weakValue
时,它不会影响bind()
返回的对象内部的副本。
我不希望这两个都能起作用。在这两种情况下,当弱值
为空时,您都在捕获它的初始值。要受后续分配的影响,您需要改为通过引用捕获。因此,在lambda中,您需要[
bind(callWeakFunction, cref(weakValue));
我认为您需要将弱的\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