字节*在库中不会保留“000000”

时间:2014-08-26 10:52:48

标签: c++

我的XCode静态库中有一个奇怪的行为(带有libc ++的目标c ++):我有一个已分配的ByteArray(unsigned char *),并且它没有从静态库中分配给0(超过给定的大小)。如果我在Design Project中直接构建源代码,一切正常,指针指向一个给定大小且所有字节都设置为0的unsigned char数组。在静态库中,看起来数组被覆盖,因为有些字节在数组中有随机字节集

我在OSX(10.9.4)上为iOS(7.1)编译XCode(5.1.1),使用libc ++作为C ++标准库,使用语言Dialect -std = c ++ 11和Default Compiler( 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持有者类的类初始值设定项中: 从库中我得到像(HEX)的结果: 000000b0b1c9555190be923b00000900

代替: 00000000000000000000000000000000

有没有人已经陷入这种奇怪的行为并且已经找出导致这种情况的原因了什么?

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

EDIT2: 所以,我想通了,缓冲器功率流发生在另一个库中,这就杀死了一切。非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

根据评论,问题出现在代码的其他地方。您可能想要检查的一件事是查看是否在任何地方使用字节打包(请参阅#pragma pack effect

如果使用字节打包,请确保所有#pragma pack(push,1)都匹配#pragma pack(pop)。如果不是(即有一个悬空#pragma pack(push,1))那么,根据给定源文件中包含的头文件,最终可能会得到不同源文件中具有不同大小的相同数据结构。

我花了几天时间研究一些遗留代码,然后才搞清楚这一点;如果这有帮助,那很好。如果没用,我很乐意将其从这篇文章中删除。

答案 1 :(得分:-3)

如果您想一步分配和零初始化,则只需calloc()new T[n]()即可。其他人在阵列中留下未初始化的“垃圾”,当然有时可能会出现零。请不要问为什么它在一个构建中为零而在另一个构建中为非零,它只是未定义,它可能是任何东西,包括圣经的开头或国家机密。

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