【问题标题】:c++: fstream::seekp changes the value of a variable it doesn't control [closed]c ++:fstream :: seekp更改它不控制的变量的值[关闭]
【发布时间】:2014-03-26 09:57:12
【问题描述】:

程序中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());
}

【问题讨论】:

  • 人们下载文件来查看您的代码的可能性很小。将其简化为展示行为的最小示例,或至少发布相关部分。
  • 您几乎可以肯定在代码中的某处调用了未定义的行为。使用像 valgrind 这样的工具来找到它。
  • -1 表示“东西东西”。该规则的原因是为了防止低质量问题,其中包括代码转储和“我的代码没有工作,为什么”,您的问题肯定是其中之一。

标签: c++ fstream


【解决方案1】:

func() 返回分配在堆栈上的对象的地址。但是当函数退出时,该地址不再有效。此外,如果对象有析构函数(或者如果它的成员有析构函数),则调用该析构函数。

我不清楚为什么你想要一个指向对象的指针而不是对象本身。假设你真的想要一个指针,你必须将它向上 new 以便在 func() 返回后指针仍然有效(完成后 delete 它)。

或者,您可以只返回对象本身:

Sector func()
{
    return Sector(0,"something");
}

当然,您必须相应地修改调用func() 的代码。

有些人会抱怨返回像Sector 这样的大型对象。但是,在这种情况下,您可以依靠智能编译器并有效地返回 Sector(“返回值优化”)。

【讨论】:

    猜你喜欢
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    相关资源
    最近更新 更多