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

求解为何会报错,代码如下

2013-12-26 
求解为什么会报错,代码如下#includeiostream#includestring.h#includeassert.h#includestdio.h#in

求解为什么会报错,代码如下

#include<iostream>
#include<string.h>
#include<assert.h>
#include<stdio.h>
#include<memory>
#include<vector>
#include<deque>

using namespace std;

class buffer
{
private:
deque<vector<char>*> _blocks;
public:
buffer();
~buffer();
char *getData();
bool addData(const char *id,const char *message);
};

buffer::buffer()
{
}

buffer::~buffer()
{
for(int a = 0; a <= _blocks.size(); a++)
{
cout<<_blocks.size()<<endl;
delete _blocks[a];
}
}

char *buffer::getData()                 //申请了内存需要自己释放
{
if(!_blocks[0]->empty())
{
char *data =new char(_blocks[0]->size());
memmove(data, &_blocks[0]->at(0), _blocks[0]->size());

delete _blocks[0];
_blocks.pop_front();
return data;
}
}

bool buffer::addData(const char *id,const char *message)    
{
assert(id != NULL && message != NULL);
assert(strlen(id) < 19);

vector<char> *data = new vector<char>(message,message+strlen(message)+1);
_blocks.push_back(data);
return true;
}

//测试
int main()
{
buffer *read = new buffer;
if(read->addData("55", "fuck") == false) std::cout<<"add erro"<<std::endl;
if(read->addData("55", "55safsdafsad") == false) std::cout<<"add erro"<<std::endl;
std::cout<<"fdsff"<<std::endl;
char *data1 = read->getData();
std::cout<<data1<<""<<std::endl;
//delete data1;                         //这样不会报错
char *data2 = read->getData();
std::cout<<data2<<std::endl;
//printf("%p",data);
delete data2, data1;//这样会有 invalid fastbin entry (free): 0x0878d288 ***的错误
delete read;
}

如题,在第一次调用成员函数时,立马删除指针再次调用不会出错。但是如果不立刻删除,进行第二次调用成员函数,就会出错,求解是为什么
[解决办法]
把所有申请内存地址打印出来,估计两个指针指向一块内存
[解决办法]
你只用了一个new,就只需要一个delete
[解决办法]
你的类成员函数里面的new,在你的析构函数里面已经释放了,你在delete read的时候,析构函数会去释放那些空间,所以delete data1,data2是多余了。当执行delete read的时候就会去释放已经释放了的空间,就会报内存访问的问题
[解决办法]
1)deque<vector<char>*> _blocks;???? 


这个程序,逻辑混乱,先整理下思路,调整下程序,再调试。

vector<char> 主要就是一个指针而已,没有必要用vector<char>*
需要的话vector <vector<char> >  足矣。

另外字符串可以用 string ,vector< string >;

2)getData
这样写法,绝对不是好的代码,返回的这个指针,一不小心就丢失了。

3)delete 不能 delete 一系列 指针,一个表达式只能 delete 1个指针。
delete data2, data1; //这是逗号表达式,值为data1,只delete 一个指针data2;
<==> delete data2;   //先执行 delete data2;
     data1;          //后执行 data1; 
      

[解决办法]
应该就是“delete不能delete一系列指针”的问题
[解决办法]
引用:
fdsff
0x9d542b0
fuck
0x9d54268
*** glibc detected *** ./buffe: invalid fastbin entry (free): 0x09d54288 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6c0c1)[0x4440c1]
/lib/libc.so.6(+0x6d930)[0x445930]
/lib/libc.so.6(cfree+0x6d)[0x448a1d]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0x397441]
./buffe[0x8048cf8]
./buffe[0x8048f6b]
/lib/libc.so.6(__libc_start_main+0xe7)[0x3eece7]
./buffe[0x80489e1]
======= Memory map: ========
001a1000-001bd000 r-xp 00000000 08:01 1053996    /lib/ld-2.12.1.so
001bd000-001be000 r--p 0001b000 08:01 1053996    /lib/ld-2.12.1.so
001be000-001bf000 rw-p 0001c000 08:01 1053996    /lib/ld-2.12.1.so
002ed000-003cc000 r-xp 00000000 08:01 134898     /usr/lib/libstdc++.so.6.0.14


003cc000-003d0000 r--p 000de000 08:01 134898     /usr/lib/libstdc++.so.6.0.14
003d0000-003d1000 rw-p 000e2000 08:01 134898     /usr/lib/libstdc++.so.6.0.14
003d1000-003d8000 rw-p 00000000 00:00 0 
003d8000-0052f000 r-xp 00000000 08:01 1054202    /lib/libc-2.12.1.so
0052f000-00531000 r--p 00157000 08:01 1054202    /lib/libc-2.12.1.so
00531000-00532000 rw-p 00159000 08:01 1054202    /lib/libc-2.12.1.so
00532000-00535000 rw-p 00000000 00:00 0 
006f5000-006f6000 r-xp 00000000 00:00 0          [vdso]
006fb000-0071f000 r-xp 00000000 08:01 1054200    /lib/libm-2.12.1.so
0071f000-00720000 r--p 00023000 08:01 1054200    /lib/libm-2.12.1.so
00720000-00721000 rw-p 00024000 08:01 1054200    /lib/libm-2.12.1.so
00df9000-00e13000 r-xp 00000000 08:01 1051186    /lib/libgcc_s.so.1
00e13000-00e14000 r--p 00019000 08:01 1051186    /lib/libgcc_s.so.1
00e14000-00e15000 rw-p 0001a000 08:01 1051186    /lib/libgcc_s.so.1
08048000-0804c000 r-xp 00000000 00:15 110        /mnt/hgfs/program/buffe
0804c000-0804d000 r--p 00003000 00:15 110        /mnt/hgfs/program/buffe
0804d000-0804e000 rw-p 00004000 00:15 110        /mnt/hgfs/program/buffe
09d54000-09d75000 rw-p 00000000 00:00 0          [heap]
b7600000-b7621000 rw-p 00000000 00:00 0 
b7621000-b7700000 ---p 00000000 00:00 0 
b7709000-b770c000 rw-p 00000000 00:00 0 
b771b000-b771e000 rw-p 00000000 00:00 0 
bfe68000-bfe89000 rw-p 00000000 00:00 0          [stack]


g++编译后运行出错信息如下

楼主能不能贴一下你最新运行的代码?因为在你贴的代码中,我没有看到在哪里有打印地址的操作啊。。
[解决办法]

char *data =new char(_blocks[0]->size()); 改成 
char *data = new char[ _blocks[0]->size()];

delete[] data1;
delete[] data2;
试试 

热点排行