我有这样的场景:
a)为iOS创建的静态库,并使用从protobuf消息文件生成的协议缓冲区类。此静态库在应用程序(A)中使用
B) protobuff消息有一堆setter和allocated_setters,都是c++代码
c)应用程序(C),它依赖于创建静态库的项目。
正在发生的事情:
当静态库包含在应用程序(A)中并且应用程序运行时,我在协议缓冲区类的一个基本设置器中获得了一个EXC_BAD_ACCESS。
inline void ABCD::set_companyname32chars(const char* value) {
set_has_companyname32chars();
if (companyname32chars_ == &::google::protobuf::internal::kEmptyString) {
companyname32chars_ = new ::std::string;
}
companyname32chars_->assign(value);
}最后一行
companyname32chars_->assign(value) 生成EXC_BAD_ACCESS。我使用这个setter的方法是这样的:
ABCD* abcd = new ABCD();
abcd->set_companyname32chars("Andes");关键是,同样的代码在同一部手机上的应用程序C上运行得很好。
静态库是用以下切片创建的: armv7、armv7s和arm64。
我正在试用的iPhone是iPhone 5和iOS 8.2(测试版)
然而,EXC_BAD_ACCESS与内存有关,
a)当相同的代码作为项目依赖项而不是静态库包含在类似的应用程序中时,为什么它可以与类似的应用程序一起工作?b)有没有一种方法可以调试并查明到底是怎么回事?我试过启用僵尸,但没有用。
发布于 2015-01-27 21:18:56
似乎::google::protobuf::internal::kEmptyString是一个变量,它同时存在于您的静态库和应用程序中,具有不同的值。因此,如果您的companyname32chars等于其中一个的地址,但不等于另一个的地址,这是无法识别的。如果变量是在静态库代码中设置的,但通过应用程序代码中的内联进行检查,则总是会发生这种情况。
https://stackoverflow.com/questions/28171311
复制相似问题