字节* 不会保留在库中"000000"
byte* does not stay "000000" in Library
我得到了一个奇怪的行为在我的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()
在循环中复制单个字节——这是一个巨大的悲观
- 有根的二进制搜索树.保留与其父级的链接
- 为多个会话保留XPtr
- 保留对其他类的成员函数的引用
- 指针保留字符串
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 如何让 GCC/Clang 在保留标识符上出错
- 必须为 C++20 协程帧保留多少内存?
- 如何将一个窗口保留在另一个应用程序窗口的前面
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 局部变量保留函数中的值
- 保留函数指针模板参数
- 变量超出范围后如何保留向量值?
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- 当为可变性配置时,boost::heap::d_ary_heap 保留的额外 std::list 的目的是什么?
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 即使在使用 delete[] 后仍保留的元素
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 将成员函数保留为未定义
- C++:如何为多个重载函数保留通用代码路径?
- 字节* 不会保留在库中"000000"