首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

有关内存回收的有关问题

2013-07-01 
有关内存回收的问题学C++学得有点空中楼阁了,一些比较基本的知识不小心给扔掉了以下是我写的一个测试代码,

有关内存回收的问题
学C++学得有点空中楼阁了,一些比较基本的知识不小心给扔掉了
以下是我写的一个测试代码,作用是将结构体abc中的全部数据写入文本文档123中,然后再从123中进行读取

#include <iostream>
#include <fstream>
using namespace std ;
typedef struct a
{
int x ;
unsigned char* tt ;
}abc ;
int main()
{
ofstream fout("123.txt", ios::binary) ;
abc* temp = new abc ;
temp->tt = new unsigned char[500] ;
temp->x = 50 ;
int i ;
for(i = 0 ; i < 499 ; i++)
{
temp->tt[i] = 'a' ;
}
temp->tt[i] = '\0' ;
fout.write((char*)temp, sizeof(unsigned char) * 500 + sizeof(int)) ;
fout.close() ;
fout.clear() ;

temp->x = 100 ;//////////// 把这块内存改个值

delete[] temp->tt ;
temp->tt = NULL ;
delete temp ;
temp = NULL ;

ifstream fin("123.txt", ios::binary) ;
temp = new abc ;
temp->tt = new unsigned char[500] ;
fin.read((char*)temp, sizeof(unsigned char) * 500 + sizeof(int)) ;
fin.close() ;
fin.clear() ;

cout<<temp->x<<endl ;/////////// 显示一下这个值

delete[] temp->tt ;
temp->tt = NULL ;
delete temp ;
temp = NULL ;

return 0 ;
}

最后释放内存的时候出错了,错误是_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

在网上查了一下,好像在删除已经被删除的内存空间时会出现这个错误

后来我又发现如果把写入和读取的语句改成如下形式就不会出错:

//////////////// 写入
fout.write((char*)&temp->x, sizeof(int)) ;
fout.write((char*)temp->tt, sizeof(unsigned char) * 500) ;

//////////////// 读取
fin.read((char*)&temp->x, sizeof(int)) ;
fin.read((char*)temp->tt, sizeof(unsigned char) * 500) ;


如果在结构体中还包含了指针,是不是就不能直接写入和读取呢?
还有什么更简捷的方法完成类似的写入和读取呢?

求各位前辈解答 堆内存 文件写入 内存释放 写入结构体
[解决办法]
你这样写入的根本就不是指针所指的500个字节的数据。。而是temp所指的后边的504个字节的数据。。其中前8个字节是x的值和指针tt的地址。。后边的字节是随机的。。你的第二种写法才是正确的。。
[解决办法]
x跟tt应该不是连续的内存吧。
[解决办法]
结构中包含了指针,当然不能直接读写了。
如果想直接读写结构体,而结构体第2部分又是变长的,可以用柔性数组或者叫变长数组实现。

热点排行