在程序中,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());
}
答案 0 :(得分:0)
func()
返回堆栈上分配的对象的地址。但是当函数退出时,该地址不再有效。此外,如果对象具有析构函数(或者如果其成员具有析构函数),则会调用析构函数。
我不清楚为什么你想要一个指向对象而不是对象本身的指针。假设你真的想要一个指针,你必须new
它,以便指针在func()
返回后保持有效(并在你完成时delete
它。)
或者,你可以直接返回对象:
Sector func()
{
return Sector(0,"something");
}
当然,您必须修改相应调用func()
的代码。
有些人会抱怨返回像Sector
这样的大型对象。但是,在这种情况下,您可以依赖编译器是智能的并有效地返回Sector
(“返回值优化”)。