gpt4 book ai didi

c++ - 为什么通过引用传递 self 会导致错误的访问错误?

转载 作者:行者123 更新时间:2023-11-28 07:15:00 24 4
gpt4 key购买 nike

以下代码片段运行正常。我将 Objective-C 函数 mytestslot 注册为源自 C++ 类 thing 的信号的回调。槽函数被定期调用,一切都表现良好。

struct CPPMembers { // pimpl related stuff for C++ members
Thing thing;
boost::signals2::scoped_connection con;
};

@implementation MyChannelClass

-(void)mytestslot:(float)num{
NSLog(@"Slot call = %0.2f", num);
}

-(id)init
{
self = [super init];
if (self) {
//Allocate storage for C++ members
_cppMembers = new CPPMembers;

auto slotLambda = [self](float n){[self mytestslot:n];};
_cppMembers->con = _cppMembers->thing.addSubscriber( slotLambda );
}


return self;
}
...

但是,当我将 slotLambda 更改为通过引用捕获时。 .

auto slotLambda = [&](float n){[self mytestslot:n];};

当信号被触发时,我在运行时得到一个 EXC_BAD_ACCESS。我猜这可能是由于 Objective-C 的 self 和 C++ 的 this 之间的根本区别,我没有掌握,但我不完全确定我是一个彻头彻尾的 Objective-C 新手!

最佳答案

因为引用是指向变量的指针伪装成在语法上表现得像变量本身。

self 的地址是什么?在 x86 架构上,它将是堆栈上的一个参数。在 arm 和 x64 上,它将是一个寄存器。无论哪种方式,一旦堆栈在 -init 返回后展开,引用将引用垃圾。

关于c++ - 为什么通过引用传递 self 会导致错误的访问错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20373891/

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