Can C++;堆栈上的类实例是否由Objective-C块捕获? 我在试图在Objto-C块中捕获一个C++类的实例时看到一些奇怪的行为。考虑下面的代码: #import <Foundation/Foundation.h> #include <stdio.h> struct Test { Test() : flag(0) { printf("%p default constructor\n", this); } Test(const Test& other) : flag(0) { printf("%p copy constructor\n", this); } ~Test() { flag = 1; printf("%p destructor\n", this); } int flag; }; int main(int argc, char **argv) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; Test test; void (^blk)(void) = ^(void) { printf("flag=%d (test=%p)\n", test.flag, &test); }; printf("about to call blk\n"); blk(); [pool release]; return 0; }

Can C++;堆栈上的类实例是否由Objective-C块捕获? 我在试图在Objto-C块中捕获一个C++类的实例时看到一些奇怪的行为。考虑下面的代码: #import <Foundation/Foundation.h> #include <stdio.h> struct Test { Test() : flag(0) { printf("%p default constructor\n", this); } Test(const Test& other) : flag(0) { printf("%p copy constructor\n", this); } ~Test() { flag = 1; printf("%p destructor\n", this); } int flag; }; int main(int argc, char **argv) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; Test test; void (^blk)(void) = ^(void) { printf("flag=%d (test=%p)\n", test.flag, &test); }; printf("about to call blk\n"); blk(); [pool release]; return 0; },c++,objective-c,objective-c++,objective-c-blocks,C++,Objective C,Objective C++,Objective C Blocks,因此,块看到的本地Test实例已调用其析构函数!您对它所做的任何操作都是未定义的行为,这很可能导致崩溃(例如,如果析构函数在未将指针设置为NULL的情况下删除了指针) 是Objy-C块支持的C++类实例变量吗?“C++对象”一节似乎表明它们是,但显然它们在这里不起作用。这是编译器/运行时中的错误吗?这是在Mac OS X v10.6.8上的GCC4.2.1、Apple build 5666上测试的。我认为这是GCC中的一个bug 当我尝试使用GCC时,我得到: 0x7fff5fbff5d0 de

因此,块看到的本地
Test
实例已调用其析构函数!您对它所做的任何操作都是未定义的行为,这很可能导致崩溃(例如,如果析构函数在未将指针设置为NULL的情况下删除了指针)


是Objy-C块支持的C++类实例变量吗?“C++对象”一节似乎表明它们是,但显然它们在这里不起作用。这是编译器/运行时中的错误吗?这是在Mac OS X v10.6.8上的GCC4.2.1、Apple build 5666上测试的。

我认为这是GCC中的一个bug

当我尝试使用GCC时,我得到:

0x7fff5fbff5d0 default constructor
0x7fff5fbff5c0 copy constructor
about to call blk
0x7fff5fbff570 copy constructor
0x7fff5fbff570 destructor
flag=1 (test=0x7fff5fbff570)
0x7fff5fbff5c0 destructor
0x7fff5fbff5d0 destructor
但是使用LLVM 2.0:

0x7fff5fbff610 default constructor
0x7fff5fbff600 copy constructor
about to call blk
flag=0 (test=0x7fff5fbff600)
0x7fff5fbff600 destructor
0x7fff5fbff610 destructor
后者遵循我对块文档的解释(并且是唯一没有明显损坏的版本)。

Sweet-你说得对:-)我在访问块外声明的std::map元素时遇到了错误的访问异常。状态为“堆栈本地对象通过copy const构造函数复制到块中”,因此它应该可以工作,因此是一个bug。切换到LLVM 3.0解决了这个问题。
0x7fff5fbff610 default constructor
0x7fff5fbff600 copy constructor
about to call blk
flag=0 (test=0x7fff5fbff600)
0x7fff5fbff600 destructor
0x7fff5fbff610 destructor