协议缓冲区代码中的EXC_BAD_ACCESS

时间:2015-01-27 13:08:23

标签: c++ ios static-libraries protocol-buffers

我有这种情况:

a)为iOS创建的静态库,使用从protobuf消息文件生成的协议缓冲区类。此静态库用于Application(A)

b)protobuff消息有一堆setter和allocated_setters,所有c ++代码

c)应用程序(C),它依赖于创建静态库的项目。

发生了什么:

当Application(A)中包含静态库并运行App时,我在协议缓冲类的基本setter之一中获得了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)有没有办法调试和完成正在发生的事情?我试过启用Zombies,但没有用。

1 个答案:

答案 0 :(得分:0)

看起来:: google :: protobuf :: internal :: kEmptyString是一个存在于静态库和应用程序中的变量,具有不同的值。因此,如果您的companyname32chars等于其中一个而不是另一个的地址,则无法识别。如果变量在静态库代码中设置,但在应用程序代码中通过内联检查,则总会发生这种情况。