gpt4 book ai didi

C++:读取 Lambda 捕获的指针时发生访问冲突

转载 作者:行者123 更新时间:2023-12-01 14:55:08 25 4
gpt4 key购买 nike

我不会假装我对 lambdas 非常有经验,但是对于这个看似简单的问题,我认为我需要更深入地了解它的实际工作原理。

我在外部范围内实例化一个对象,并使用 2 个 lambda,我尝试修改该指针。

// Object to be manipulated
Object* obj= nullptr;

// To be invoked externally in order to construct and initialize obj
std::function<void(std::function<void(const String&)>)> SetObject
= [&obj](std::function<void(const String&)> func)
{
obj= new Object();
// ... Initialize Values
};

// To be invoked externally to reset and delete obj
std::function<void()> ResetObject
= [&obj]()
{
if(obj)
{
delete obj;
obj= nullptr;
}
};

主代码执行并首先调用 重置 在创建 Object 的新实例之前的方法。假设“主”代码无法访问、读取或修改 obj - 因此依赖于盲重置。

预期结果 :第一次调用重置表达式时,对 obj 的检查应该返回 false,因为 obj 在外部范围内被设置为 nullptr - 没有任何 react 。

实际结果:到执行 reset 时,obj 不再指向 NULL,检查返回 true 并调用 delete,导致访问冲突。

我想知道我尝试做的任何事情是否都是无效的操作,或者我捕获变量的方式是否不正确。我尝试按值捕获指针,将函数设置为可变,并且出于绝望将引用和值捕获相结合。

EDIT: At this point, I believe the scope of the object is the main culprit as pointed out by others. I will attempt a workaround with that in mind and report back.

最佳答案

虽然我们无法仅从您的示例中看出,但我怀疑 obj可能是一个局部变量,在被捕获后超出范围。解决此问题的一种方法是添加另一个间接级别:

Object** objptr = new Object*();

std::function<void(std::function<void(const String&)>)> SetObject
= [objptr](std::function<void(const String&)> func)
{
*objptr = new Object();
};

std::function<void()> ResetObject
= [objptr]() // Note we are now capturing objptr by value
{
if(*objptr)
{
delete *objptr;
*objptr = nullptr;
}
// Is objptr reused by another call to SetObject?
// If not, delete it here as well.
// delete objptr;
};

关于C++:读取 Lambda 捕获的指针时发生访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50491347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com