У меня есть метод, который выполняется в фоновом потоке. Из этого метода я пытаюсь dispatch_async
блокировать основной поток. Блок использует локальный объект С++, который должен быть скопирован в соответствии с ссылкой Apple. Я получаю ошибку сегментации, и из трассы я вижу, что происходит что-то очень отрывочное. Вот упрощенная версия моего кода.
struct A
{
A() { printf("0x%08x: A::A()\n", this); }
A(A const &that) { printf("0x%08x: A::A(A const &%p)\n", this, &that); }
~A() { printf("0x%08x: A::~A()\n", this); }
void p() const { printf("0x%08x: A::p()\n", this); }
};
- (void)runs_on_a_background_thread
{
A a;
a.p();
dispatch_async(dispatch_get_main_queue(), ^{
printf("block begins\n");
a.p();
printf("block ends\n");
});
}
И это результат:
0xbfffc2af: A::A()
0xbfffc2af: A::p()
0xbfffc2a8: A::A(A const &0xbfffc2af)
0x057ae6b4: A::A(A const &0xbfffc2a8)
0xbfffc2a8: A::~A()
0xbfffc2af: A::~A()
0xbfffdfcf: A::A(A const &0x57ae6b4)
0xbfffdfcf: A::~A()
block begins
0xbfffdfcf: A::p()
block ends
0x057ae6b4: A::~A()
Есть две вещи, которые я не понимаю. Первый из них заключается в том, что к тому моменту, когда он доходит до 0xbfffdfcf: A::p()
, деструктор на этом объекте уже вызван.
Вторая проблема, с которой я сталкиваюсь, заключается в том, почему так много вызываемых конструкторов. Я ожидаю. Это должно произойти, когда создается копия a
, которая будет захвачена блоком.
Я использую Xcode 3.2.5 с GCC. Я испытываю такое же поведение на симуляторе и на устройстве.