gpt4 book ai didi

c++ - Objective-C block 和 C++ 对象

转载 作者:IT老高 更新时间:2023-10-28 23:19:04 24 4
gpt4 key购买 nike

我有一个正在后台线程上执行的方法。通过该方法,我尝试在主线程上 dispatch_async 一个 block 。该 block 使用一个本地 C++ 对象,该对象应该是根据 Apple reference 复制构造的。 .我遇到了段错误,从跟踪中我看到正在发生一些非常粗略的事情。这是我的代码的简化版本。

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 的拷贝以被 block 捕获时发生。

我正在使用带有 GCC 的 Xcode 3.2.5。我在模拟器和设备上遇到了相同的行为。

最佳答案

我刚刚在 LLVM 3.0 上对此进行了测试。

0xb024ee18: A::A()
0xb024ee18: A::p()
0xb024ee04: A::A(A const &0xb024ee18)
0x06869364: A::A(A const &0xb024ee04)
0xb024ee04: A::~A()
0xb024ee18: A::~A()
block begins
0x06869364: A::p()
block ends
0x06869364: A::~A()

您可以看到在这种情况下适本地调用了析构函数,我将其归结为您正在使用的极其过时的编译器中的编译器错误。

本例中的拷贝似乎符合我的预期。该 block 在被捕获时将基于堆栈的对象复制到该 block 中。然后当 block 从堆栈复制到堆时再次。

关于c++ - Objective-C block 和 C++ 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8112656/

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