今日在写代码的过程中,使用fstream类对文件进行写入&读取操作,在程序结尾处总会抛出访问了已经释放过的内存的异常,经过耐心调试,终于发现了问题所在。
起初我定义了一个简单的结构体:
struct Info
{
char _ch;
int _count;
string _str;
};
并使用fstream的二进制读写方式,直接将该结构体创建的对象写入一个文件中,之后又从文件中以二进制方式读取出结构体的数据并直接赋值给一个结构体对象。这样做是十分不对的。
问题所在
问题就出在结构体中的stirng类,string是STL中定义好的一个类,在模拟实现string类的过程中,可以知道,在string类的内部,一定存在一个或多个指向堆空间的指针,而当一个string类使用完成时,string类会自行调用它的析构函数来释放stirng类中指针指向的堆空间。而当我一二进制的方式,直接将string的数据写入文件时,自然也会将string类中指向堆空间的指针写入进去,之后读出时,就会造成出现两个string类对象指向同一块堆空间的现象,而一份堆空间被析构两次,自然是不被允许的。
当要以二进制读写将数据写入一个文件时,只有POD类型的数据可以安全的写入到文件中之后再读取出来。