为什么通过引用传递self会导致错误的访问
Why does passing self by reference result in a bad access error?
下面的代码片段运行正常。我注册Objective-C函数mytestslot
作为源自C++类thing
的信号的回调。slot函数被周期性地调用,并且一切都表现良好。
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
返回后堆栈展开,引用将引用垃圾。
这个问题与self
或Objective-C无关。
在C++中,获取一个通过引用捕获变量的lambda并以lambda(或其副本)比它在其中创建的函数寿命更长的方式存储它是没有意义的。
这是因为lambdas捕获的变量(通过值或引用)必须具有自动存储持续时间(即局部变量),并且在C++中,在指向的变量超出范围后访问引用是未定义的行为。
相关文章:
- 尝试从C++访问 UWP 的电子邮件邮件类会导致"REGDB_E_CLASSNOTREG类未注册"错误
- C++ - 循环访问指针数组会导致错误
- 执行错误访问 遍历向量
- 错误访问 读入对象后
- 如何修复 CopyFile() 错误 5 - 访问被拒绝错误
- CreateFile 在尝试打开目录进行读取时始终返回错误 5(访问被拒绝)
- 范围检查检测到的检测代码和超出范围的错误访问
- 查找() 上的 C++ 错误访问错误
- 错误访问另一个插件中的类(错误:未定义的引用)
- C STD ::排序Intel编译器错误:访问违规
- libcurl、OSX、curl_multi_执行错误访问
- C++数组错误:访问冲突读取位置0xC0000005
- C++LinkedList错误:访问冲突错误
- 使用.open()成员函数C++的ifstream数组的错误访问代码
- C++ 段错误 访问对象指针向量的 std::vector.size()
- JNI 从 C 错误访问对象数组
- 带有内存错误访问的C++结构new
- XCode C++上的错误访问错误
- 错误访问冲突写入位置0x00229C20.尝试在控制台中输入字符串时
- MySQL 连接器/C++ 错误访问崩溃