如果基于 Xcode 7 而不是 Xcode 8,.mm 文件可以工作
.mm file works if built on Xcode 7 but not on Xcode 8
我正在调用第三方开发人员编译的 C 库中的函数,我不能透露。问题是函数 returns 在使用 Xcode 8
构建应用程序时出错,但在使用 Xcode 7
时工作正常。我在我的应用程序中从 .mm
文件调用库函数。我知道这有可能是由第 3 方库引起的,但是 Xcode 版本中的哪些变化可能会影响到这一点?我不知道从哪里开始,也无法在此处粘贴代码。
我想出了一个解决方法,但仍然不知道为什么会这样。
我发现错误的原因是 Optimization Level
。在 XCode 8 时,我需要设置优化级别才能正常工作,否则它会失败。
具体失败的源码是这样的:
char subject[256];
memset(&subject, 0x00, sizeof(subject));
strcpy(subject, "Test");
mail.emailSubject = subject
我用这个替换了上面的代码:
mail.emailSubject = (char*)"Test";
如果有人能解释一下,请随意。谢谢!
第一段代码是分配一个堆栈字符数组,然后将其分配给我不知道是什么类型的对象的emailSubject。如果它不复制堆栈内存而只是分配它,那么当函数 returns 堆栈内存将被释放并且 emailSubject 将持有脏内存。
当分配 "Test" 时,编译器将分配 "Test" 作为静态变量,该变量不会在函数 returns.
后释放
希望对您有所帮助。
我正在调用第三方开发人员编译的 C 库中的函数,我不能透露。问题是函数 returns 在使用 Xcode 8
构建应用程序时出错,但在使用 Xcode 7
时工作正常。我在我的应用程序中从 .mm
文件调用库函数。我知道这有可能是由第 3 方库引起的,但是 Xcode 版本中的哪些变化可能会影响到这一点?我不知道从哪里开始,也无法在此处粘贴代码。
我想出了一个解决方法,但仍然不知道为什么会这样。
我发现错误的原因是 Optimization Level
。在 XCode 8 时,我需要设置优化级别才能正常工作,否则它会失败。
具体失败的源码是这样的:
char subject[256];
memset(&subject, 0x00, sizeof(subject));
strcpy(subject, "Test");
mail.emailSubject = subject
我用这个替换了上面的代码:
mail.emailSubject = (char*)"Test";
如果有人能解释一下,请随意。谢谢!
第一段代码是分配一个堆栈字符数组,然后将其分配给我不知道是什么类型的对象的emailSubject。如果它不复制堆栈内存而只是分配它,那么当函数 returns 堆栈内存将被释放并且 emailSubject 将持有脏内存。
当分配 "Test" 时,编译器将分配 "Test" 作为静态变量,该变量不会在函数 returns.
后释放希望对您有所帮助。