C++:fstream::seekp 更改它无法控制的变量的值
c++: fstream::seekp changes the value of a variable it doesn't control
在程序中,writeSector函数调用seekToSector。当seekToSector调用seekp时,writeSector中的sec变量被改变。谁能解释一下原因或给出一个解决方案?
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
class Sector
{
public:
int num;
char data[1020];
Sector()
{
num = -1;
for(int i=0;i<1020;i++)
data[i] = (char)0;
}
Sector(int n,string str)
{
num = n;
for(int i=0;i<str.length();i++)
data[i] = str[i];
}
string toData()
{
string str = to_string(num);
for(int i=0;i<1020;i++)
str += data[i];
return str;
}
};
class Disk
{
public:
fstream dskfl;
int currentPos;
void seekToSector(int index)
{
currentPos = index;
dskfl.seekp(1024*currentPos);
}
void writeSector(int index, Sector * sec)
{
seekToSector(index);
dskfl.write(sec->toData().c_str(),1024);
}
};
Sector * func()
{
Sector sec(0,"something");
return &sec;
}
void main()
{
Disk disk;
disk.dskfl.open("name",ios::binary | ios::out);
disk.writeSector(0,func());
}
func()
返回在堆栈上分配的对象的地址。但是当函数退出时,该地址不再有效。另外,如果对象有析构函数(或者其成员有析构函数),则调用该析构函数。
我不清楚为什么你想要一个指针指向一个对象,而不是对象本身。假设你真的想要一个指针,你必须new
它,以便指针在func()
返回后仍然有效(当你完成时,delete
它)。
或者,您可以直接返回对象本身:
Sector func()
{
return Sector(0,"something");
}
当然,您必须相应地修改调用func()
的代码。
有些人会抱怨返回像Sector
这样大的对象。然而,在这种情况下,你可以依赖编译器的智能和返回Sector
有效("返回值优化")。
相关文章:
- 在 c++ 中基于范围的 for 循环中使用引用作为控制变量
- 需要帮助定义循环控制变量(while loops)C++
- 代码样式:在 switch/if 语句的分支中重用控件表达式或控制变量
- 控制通过类中的成员函数更改成员变量的能力C++
- 访问lambda内部循环控制变量
- C 是循环控制变量,并且在循环中相同
- 是否有任何类型特征控制成员类型(不是成员变量)
- 如何用python中的变量控制循环的增量
- 我可以控制调试器窗口中显示的浮点数和双精度变量的位数吗?
- 通过自己的条件变量 c++ 控制每个线程
- 控制C++中的实例化和成员变量
- 变量定义在 C++ 的控制结构中做什么
- 在控制结构块中定义变量
- 按字符控制变量
- 如何防止g++优化由IRQ可以更改的变量控制的循环
- 在工作线程完成MFC时禁用控制变量
- 控制C++AMP中的索引变量
- 控制未初始化堆栈变量的填充值(例如0xCC)
- 模板:如何使用模板变量控制构造函数参数的数量
- 定义控制结构中的变量