库中静态分配的 zlib 字节数组上的 memset 使 Objective-C++ 程序崩溃

Posted

技术标签:

【中文标题】库中静态分配的 zlib 字节数组上的 memset 使 Objective-C++ 程序崩溃【英文标题】:memset on a statically-allocated zlib Byte array in a library crashes an Objective-C++ program 【发布时间】:2011-07-21 19:11:15 【问题描述】:

我正在编写一个库,它使用在 zlib.h 中定义的 Byte 类型的静态分配 C 数组。我发现代码在调用 memset 时崩溃。完整代码如下所示:

Byte compressedDataBuffer[kLabelBufSiz]; 
memset (compressedDataBuffer, 0, (kLabelBufSiz * sizeof(Byte)));

我尝试预先计算 kLabelBufSiz * sizeof(Byte) 的值并使用 memset 的数值,但没有任何区别。这是一个单线程程序,两次调用之间没有代码,所以我知道内存和指针没有变化。我确认 sizeof(Byte) 为 1。我尝试将数组类型更改为 char,并且停止了崩溃,所以似乎 Byte 类型可能在这里起作用。

我编写了一个较小的程序来调用这个库函数,并且那个程序不会崩溃。不崩溃的程序是纯 C++,而崩溃的程序是 Objective-C++。我正在使用 gcc-4.2 和 XCode 在 Mac OSX 10.6.7 上构建它们。 ObjC++ 有什么可能在这里引起问题吗?我以前从未遇到过从 ObjC++ 调用的 C++ 库的问题,但这并不意味着它们不存在。非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

Byte 是一个包装类。使用字符而不是字节。除非你必须使用 Byte,否则不要使用 memset

【讨论】:

不幸的是,我必须使用字节。有没有比 memset 更好的方法来清零数组? 你可以使用 for 循环。 memset 实际上只用于大块内存,它比 for 循环快 这是个好主意!顺便说一句,我确实尝试将一个字节放在数组的最后一个位置,并且它起作用了(compressedDataBuffer[kLabelBufSiz-1] = (Byte)1;)。我不确定为什么 memset 会导致问题。 我尝试了一个 for 循环,它修复了崩溃。不幸的是,该循环需要大约 130,000 次迭代,但至少它可以工作。我希望我知道 memset 失败的原因。

以上是关于库中静态分配的 zlib 字节数组上的 memset 使 Objective-C++ 程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

就地址值而言,静态分配的数组的内存分配是不是总是连续的?

无需 DLL 静态链接 zlib

byte* 不会在库中保持“000000”

类型化数组

webservice(axis)接口上传文件附件 及 用zlib解压缩

C语言进阶四.动态内存管理