求解为什么会报错,代码如下#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一系列指针”的问题
[解决办法]楼主能不能贴一下你最新运行的代码?因为在你贴的代码中,我没有看到在哪里有打印地址的操作啊。。
[解决办法]把
char *data =new char(_blocks[0]->size()); 改成
char *data = new char[ _blocks[0]->size()];
delete[] data1;
delete[] data2;
试试