类静态数组字段突然更改值(C++)
Class Static Array field change value suddenly(C++)
这是Block类的片段:
class Block { public:
//size satu blok(dalam byte)
static const int BLOCK_SIZE = 4096;
Block(int number,byte *data):number(number) {
for(int i=0;i<BLOCK_SIZE;i++) {
this->data[i] = data[i];
}
}
void test();
private:
byte data[BLOCK_SIZE];
const int number; };
注意,字节只是typedef无符号字符
这是其他类中初始化块变量的函数之一
bool Filesystem::getBlock(int number, Block *block) {
fstream fin(path);
if(!fin.is_open() || number<0) {
return false;
}
byte data[Block::BLOCK_SIZE];
fin.seekg(Block::BLOCK_SIZE*number,ios::beg);
for(int i=0;i<Block::BLOCK_SIZE;i++) {
fin>>data[i];
}
block = new Block(number,data);
(*block).test();//this is the first test, this prints values as expected
fin.close();
return true;
}
这是另一个片段:
Block *superblock;
getBlock(0,superblock);
(*superblock).test();//this is the second test, this prints random value
test是打印块中数据的前四个字节的函数当我第一次在getblock中使用测试函数时,它会像我想要的那样打印(与文件相同(,但当我在调用getblock后第二次尝试打印时,它打印随机值
谁知道哪里出了错?
block = new Block(number,data);
此行创建一个新的Block
对象,并将其指定给参数block
。但是,指针block
通过值传递到函数中,因此原始指针superblock
不受此行的影响。因此,您在函数内部和外部对不同的Block
对象进行操作。
为了解决这个问题,您可以使用对指针的引用作为参数:
bool Filesystem::getBlock(int number, Block *&block);
这一行有几个错误:
fstream fin(path);
在这些线路上:
for(int i=0;i<Block::BLOCK_SIZE;i++) {
fin>>data[i];
}
第一行是错误的,因为你必须以二进制模式打开文件:
fstream fin(path, ios::binary);
另一个错误是,您将数据读取为字符,而不是二进制数据。此外,您不需要在循环中一次一个字节:
fin.read(data, Block::BLOCK_SIZE);
我还建议将fstream
更改为ifstream
,因为在函数中不会对文件进行任何输出。
另一个错误,正如在另一个答案中指出的,是如何传递block
参数。
我不能仅从代码中判断,但看起来您可能只是将data
的值存储在Block
构造函数中,而不是将其内容复制到成员data
数组中。data
将在getBlock()
结束时超出范围,这将使任何读取其内存的尝试无效。
您可能必须以二进制模式打开fin流。否则,'\r'个字符将丢失(跳过(。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- cmake在我的项目中所需的所有静态库都不成功
- C++从另一个类访问公共静态向量的正确方法是什么
- 基于boost的程序的静态链接——zlib问题
- 在静态库中嵌入类方法
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 如何在C++中获得"静态纯虚拟"功能?
- 私有类型的静态常量成员
- 使用gcc从静态链接的文件中查找可选符号
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 如何在C++中使用非静态成员函数作为回调函数
- 将静态库链接到不带-fPIC的共享库中
- 静态结构和一个定义规则
- 为什么虚函数不能是静态的和全局的?
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身