【问题标题】:Error in free(): invalid sizefree() 中的错误:大小无效
【发布时间】:2018-03-22 06:46:53
【问题描述】:
#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 和一条错误消息:*** Error in ./io: free(): invalid size: 0x00007ffea93f64b0 ***Aborted (core dumped) 谁能解释这个错误以及我应该怎么做才能克服这个问题。

【问题讨论】:

  • 您不喜欢将字符串写入二进制文件的说法。考虑一个文本文件以获得成功,“google.txt”是一个很好的提示,这正是您真正想要的。
  • 无关:小心#include &lt;bits/stdc++.h&gt;。它是 g++ 编译器的内部实现头文件,不打算供用户代码使用。它还包括几乎整个 C++ 标准库。那是很多你可能没有使用的东西。将它与using namespace std 结合起来,您已经将数千个标识符放入全局命名空间中,它很容易与您的代码发生冲突。大多数时候你可能会很好,但如果你很幸运,你会得到奇怪的编译器错误,如果你不幸运,就会出现奇怪的程序行为。
  • @user4581301 谢谢。我会记住这一点

标签: c++ file-handling


【解决方案1】:

问题是因为您将原始std::string 对象写入文件,然后再次读取它。这会导致未定义的行为

这不起作用,因为std::string 基本上(并且简化了)只是指向实际字符串数据的指针。当你写字符串对象时,你写指针,当你从文件中读回对象时,你读指针。问题是现在你有 two 字符串对象都指向相同的数据。当第一个对象超出范围并被破坏时,它将释放字符串数据,使另一个对象具有指向不再由您的进程拥有的数据的无效指针。当第二个对象被破坏时,它会尝试释放已经释放的数据。

仅当您在单个进程中保存和加载对象时。如果您试图在不同的进程中加载​​对象(即使它是同一个程序),那就更糟糕了,而且对于现代虚拟内存系统,没有两个进程具有相同的内存映射。

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

【讨论】:

  • 你能快速给出解决上述代码中这个问题的建议吗?
  • @ankit 不是真的,因为我不知道用例或您希望代码解决的问题。但是,首先您可以使用普通格式的输出和输入或std::getline 或类似功能将类写入文本文件。
【解决方案2】:

std::string 大小是可变的,试试下面的代码:

```

char name[256];
char reg[256];

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

```

【讨论】:

  • 感谢您的支持
猜你喜欢
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 2012-10-25
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多