在读取/写入文件时双重免费或损坏
double free or corruption while reading/writing from file
我的代码:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
class student{
private:
string nm, addr;
int roll;
public:
student(string name="a", string address="a", int rollnumber=0):
nm(name), addr(address), roll(rollnumber){}
void show(){
cout<<nm<<endl<<addr<<endl<<roll<<endl;
}
};
int main(){
fstream file1;
file1.open("obj.file", ios::in|ios::out|ios::binary|ios::ate);
student s1("cipher", "MyAddress", 21);
student s2;
file1.write(reinterpret_cast<char *>(&s1), sizeof(s1));
file1.flush();
file1.seekg(0,ios::beg);
file1.read(reinterpret_cast<char *>(&s2), sizeof(s2));
s2.show();
return 0;
}
结果是这样的。我找不到任何线索,为什么会出现错误?
$ ./fh2
cipher
MyAddress
21
*** Error in `./fh2': double free or corruption (fasttop): 0x08e14178 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x767c2)[0xb756f7c2]
/lib/i386-linux-gnu/libc.so.6(+0x77510)[0xb7570510]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0xb7713a3f]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZNSs4_Rep10_M_destroyERKSaIcE+0x1b)[0xb777845b]
/usr/lib/i386-linux-gnu/libstdc++.so.6(+0x4671a)[0xb771171a]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZNSsD1Ev+0x2e)[0xb77784be]
./fh2[0x804902d]
./fh2[0x8048dc0]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0xb7512905]
./fh2[0x8048a91]
======= Memory map: ========
08048000-0804a000 r-xp 00000000 08:05 2793609 /home/cipher/cipher-codes/practice-for-cpp-exam/fh2
0804a000-0804b000 r--p 00001000 08:05 2793609 /home/cipher/cipher-codes/practice-for-cpp-exam/fh2
0804b000-0804c000 rw-p 00002000 08:05 2793609 /home/cipher/cipher-codes/practice-for-cpp-exam/fh2
08e12000-08e33000 rw-p 00000000 00:00 0 [heap]
b74b4000-b74b6000 rw-p 00000000 00:00 0
b74b6000-b74f7000 r-xp 00000000 08:05 11707309 /lib/i386-linux-gnu/libm-2.17.so
b74f7000-b74f8000 r--p 00040000 08:05 11707309 /lib/i386-linux-gnu/libm-2.17.so
b74f8000-b74f9000 rw-p 00041000 08:05 11707309 /lib/i386-linux-gnu/libm-2.17.so
b74f9000-b76a7000 r-xp 00000000 08:05 11707258 /lib/i386-linux-gnu/libc-2.17.so
b76a7000-b76a9000 r--p 001ae000 08:05 11707258 /lib/i386-linux-gnu/libc-2.17.so
b76a9000-b76aa000 rw-p 001b0000 08:05 11707258 /lib/i386-linux-gnu/libc-2.17.so
b76aa000-b76ae000 rw-p 00000000 00:00 0
b76ae000-b76c9000 r-xp 00000000 08:05 11706373 /lib/i386-linux-gnu/libgcc_s.so.1
b76c9000-b76ca000 r--p 0001a000 08:05 11706373 /lib/i386-linux-gnu/libgcc_s.so.1
b76ca000-b76cb000 rw-p 0001b000 08:05 11706373 /lib/i386-linux-gnu/libgcc_s.so.1
b76cb000-b77a8000 r-xp 00000000 08:05 8300861 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.18
b77a8000-b77ac000 r--p 000dc000 08:05 8300861 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.18
b77ac000-b77ad000 rw-p 000e0000 08:05 8300861 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.18
b77ad000-b77b4000 rw-p 00000000 00:00 0
b77ca000-b77ce000 rw-p 00000000 00:00 0
b77ce000-b77cf000 r-xp 00000000 00:00 0 [vdso]
b77cf000-b77ef000 r-xp 00000000 08:05 11707234 /lib/i386-linux-gnu/ld-2.17.so
b77ef000-b77f0000 r--p 0001f000 08:05 11707234 /lib/i386-linux-gnu/ld-2.17.so
b77f0000-b77f1000 rw-p 00020000 08:05 11707234 /lib/i386-linux-gnu/ld-2.17.so
bfd7c000-bfd9d000 rw-p 00000000 00:00 0 [stack]
[1] 24855 abort (core dumped) ./fh2
您正在逐字节地复制s1
到s2
(及其相关数据成员)。这适用于POD(普通旧数据)类型,但不能保证适用于复杂类型。您的字符串不能以这种方式复制。当它们的析构函数运行时,它们可能会试图释放同一块内存(它们的内部数据存储),即双delete
。
您绕过了string类的复制机制,正是为了避免这种情况。它和调用memcpy
或类似的东西没有什么不同。不能工作。您不能像这样持久化非pod类型。
即使你没有得到错误,在逻辑意义上它仍然是错误的。想想吧;这些字符串将动态地分配它们的内部内存存储,也就是说,它们将存储指向某些内存块的指针。一旦字符串的析构函数运行,该指针将无效,而且如果您决定从现在开始一周后反序列化该文件,它当然也不会有效。
当你写s1的内容时,你实际上是在复制字符串内部的指针。然后把这个写进s2的字符串。当s1和s2调用它们的解构函数时,它们都将释放同一个字符串指针,也就是你的double free。
相关文章:
- 为什么会发生堆损坏
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 平均图像时图像损坏
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 为什么C中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- C++双重释放或损坏(out)
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 使用全局声明的向量时,C++双重释放错误/损坏
- 使用线程和静音时,双免费或损坏(!prev)错误
- IPIV magma_getrs_gpu上的双免费或损坏(OUT)
- 尝试在unordered_map中删除时双免费或损坏
- 范围末尾的C 双免费或损坏错误
- C 双免费或损坏错误
- C++:双倍免费或损坏(out)
- 检测到glibc:双重免费或损坏
- MxCalloc和MxFree与OpenMP结果双重免费或损坏
- 程序结束时双重释放或损坏,没有免费
- 在执行并行版本时,双重免费或损坏(fasttop)
- 在读取/写入文件时双重免费或损坏