我有一堂这样的课
class MyClass{
public:
MyClass(const int *a, int *aC= nullptr);
MyClass(MyClass &myClass) = delete;
MyClass(MyClass &&yClass) noexcept;
}
我的处理器函数是这样定义的
my_processor = ^(int* c1, const int* a1){
__block MyClass obj(a1 c1);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)
{
ProcessMyData(obj);
});
}
当我运行代码时,我遇到了这样的崩溃
0 libsystem_platform.dylib 0x00007fff20359029 _platform_memmove$VARIANT$Haswell + 41
1 libsystem_blocks.dylib 0x00007fff2004f3d1 _Block_copy + 117
我做错了什么?
答案 0 :(得分:0)
鉴于您提供的代码,我认为我们无法最终找到问题的根源,因为它不足以重现问题。
对我来说最明显的可能性是:
my_processor = ^(int* c1, const int* a1){
__block MyClass obj(a1 c1);
dispatch_async(
这里,c1
和 a1
是指针。我假设与您发布的代码不同,构造函数的这些参数以某种方式影响构造对象的状态。它们的生命周期对对象的内部状态有影响吗?换句话说,其中一个指针是否存储在对象中,以后会被取消引用吗?传递给 dispatch_async()
的块很可能在不同的线程上在不确定的时间点被调用。
因此,如果任何一个指针存储在 MyClass
中,它们必须保持有效,直到保证异步分派完成。 (如果难以保证,请考虑复制数据而不是存储指针。)
了解崩溃的确切时间可能也有帮助。您还可以明确 _Block_copy
用于诊断目的,而不是让它按需发生,以查看是否也会引发崩溃。
但本质上,您在这里没有提供足够的上下文来给出任何接近明确答案的内容。编辑您的问题,以便代码可以运行并显示崩溃,我们可以为您提供帮助。