代码之家  ›  专栏  ›  技术社区  ›  ankit

free()中出错:大小无效

  •  1
  • ankit  · 技术社区  · 6 年前
    #include <bits/stdc++.h>
    
    using namespace std;
    
    class student
    {
     string name;
     string reg;
    public:
     void getdata()
     {
      getline(cin,name);
      getline(cin,reg);
     }
     void printdata()
     {
      cout<<name<<"\t"<<reg<<endl;
     }
    };
    
    int main()
    {
     ifstream fin;
     ofstream fout;
     student obj;
     fout.open("google.txt",ios::out|ios::binary);
     obj.getdata();
     fout.write((char*)&obj,sizeof(obj));
     fout.close();
     student obj2;
     fin.open("google.txt",ios::in|ios::binary);
     fin.read((char*)&obj2,sizeof(obj2));
     obj2.printdata();
     fin.close();
     return 0;
    }
    

    我正在尝试对象文件处理的基本读写操作。 但在执行上述代码后,我成功地能够写入和读取,但我收到一条错误消息 *** Error in ./io: free(): invalid size: 0x00007ffea93f64b0 ***Aborted (core dumped)

    输入: 火刃 ,17HFi394 输出:
    火刃,17HFi394 和错误消息: ***中出错/io:free():无效大小:0x00007ffea93f64b0***已中止(内核转储) 有人能解释一下这个错误吗?我该怎么克服这个问题呢。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Some programmer dude    6 年前

    问题是你写了一个原始的 std::string 对象,然后再次读取该文件。这导致 未定义的行为

    这不起作用,因为 标准::字符串 基本上(并简化)只是一个指向实际字符串数据的指针。写入字符串对象时,写入指针;从文件读回对象时,读取指针。问题是现在你有 字符串对象都指向相同的数据。当第一个对象超出范围并被解构时,它将释放字符串数据,而另一个对象将使用无效指针指向不再属于进程的数据。当第二个对象被破坏时,它将尝试释放已经释放的数据。

    只有在一个进程中保存和加载对象时,才会出现这种情况。如果试图在不同的进程中加载对象(即使它是同一个程序),情况会更糟,对于现代虚拟内存系统,没有两个进程具有相同的内存映射。

    要将数据保存到文件中,您应该研究 serialization

        2
  •  0
  •   tujiaw    6 年前

    std::字符串大小是可变的,请尝试以下代码:

    ```

    char name[256];
    char reg[256];
    
    void getdata()
    {
        std::cin.getline(name, sizeof(name));
        std::cin.getline(reg, sizeof(reg));
    }
    

    ```