字节* 不会保留在库中"000000"

byte* does not stay "000000" in Library

本文关键字:000000 保留 字节      更新时间:2023-10-16

我得到了一个奇怪的行为在我的XCode静态库(objective c++与libc++):我有一个分配的ByteArray (unsigned char *),它不分配到0(超过给定的大小)从静态库内。如果我直接在设计项目中构建源代码,一切都很好,指针指向一个给定大小的无符号字符数组,所有字节设置为0。从静态库内部看,似乎数组被覆盖了,因为数组中的一些字节具有随机字节集

我在OSX(10.9.4)上为iOS(7.1)编译XCode(5.1.1),使用libc++作为c++标准库,使用语言方言-std=c++11与默认编译器(Apple LLVM 5.1)。

我尝试了不同的分配方式:

typedef unsigned char byte;
class ByteArray {
private:
    byte* mBytes;
    long mSize;  
public:
    ByteArray(long Size){

        //1
        this->mBytes = new byte[Size]();
        //2
        this->mBytes = (byte*) calloc(Size, sizeof(byte));
        //3
        this->mBytes = (byte*)malloc(Size*sizeof(byte));
        memset(this->mBytes, 0, Size);
        //4
        this->mBytes = (byte*)malloc(Size*sizeof(byte));
        byte zero = 0;
        for (int i = 0; i < Size; i++)
        {
            memcpy(this->mBytes + i, &zero, 1);
        }
        //Set size
        this->mSize = Size;
    }
    //with Data
    ByteArray(byte* Bytes, long Size){
       this->mBytes = new byte[Size]();
       memcpy(this->mBytes, Bytes, Size);
       this->mSize = Size;
    }
}

我是这样初始化的:

ByteArray* zeroBytes = new ByteArray(16);

以上代码位于ByteArray holder类的类初始化项中:从库内我得到的结果像(HEX):000000 b0b1c9555190be923b00000900

代替:00000000000000000000000000000000

有没有人已经发现了这种奇怪的行为,并找出了导致这种行为的原因?

编辑:如果我用给定的数据初始化,字节*永远不会损坏。

edit2:所以,我弄明白了,缓冲区溢出发生在另一个库,这杀死了一切。非常感谢你的帮助。

根据注释,问题似乎在代码的其他地方。您可能想要检查的一件事是查看是否在任何地方使用了字节打包(参见#pragma pack effect)

如果使用字节打包,确保所有#pragma pack(push,1)都有一个匹配的#pragma pack(pop)。如果没有(即有一个悬空的#pragma pack(push,1)),然后,取决于哪个头文件包含一个给定的源文件,你可能最终与相同的数据结构有不同的大小在不同的源文件。

我花了几天时间在一些遗留代码上,才弄清楚这个问题;如果这有帮助,那太好了。如果它没有用,我很乐意把它从这篇文章中删除。

如果您想在一个步骤中分配和零初始化,只有calloc()new T[n]()可以。其他的在数组中留下未初始化的"垃圾",当然有时可能恰好为零。请不要问为什么它在一个版本中为零而在另一个版本中为非零,它只是未定义的,它可以是任何东西,包括圣经的开头或国家机密。

您也可以使用memset()一次将所有字节归零。不要使用memcpy()在循环中复制单个字节——这是一个巨大的悲观