参考:http://www.cplusplus.com/reference/vector/vector/?kw=vector
vector 使用时可以预分配空间
class A
{
char* buff;
int index;
save()
{
};
};
eq1:
std:vector<A> m_vector;
m_vector.reserve(100);
eq2:
std:vector<A*> m_vector;
m_vector.reserve(100);
使用:
use()
{
//eq1:
A a;
m_vector.push_back(a);
m_vector[0].save();
//eq2:
A b = new A();
m_vector.push_back(b);
m_vector[0]->save();
}
实例:
/
class Cellbuff
{
public:
Cellbuff()
{
m_buffer=0;
m_mlen=0;
m_dlen=0;
m_cfname="";
m_cqname="";
};
~Cellbuff()
{
if(m_buffer)
free(m_buffer);
m_buffer=0;
m_mlen=0;
m_dlen=0;
m_cfname="";
m_cqname="";
};
void Release()
{
if(m_buffer)
free(m_buffer);
m_buffer=0;
m_mlen=0;
m_dlen=0;
m_cfname="";
m_cqname="";
}
void Save(const void *pbuff,unsigned int len)
{
/*if(m_buffer)
{
if(m_mlen>=len)
{
memcpy(m_buffer,pbuff,len);
m_dlen=len;
return;
}
else
{
printf("remalloc:%d\r\n",len);
free(m_buffer);
m_buffer=0;
m_dlen=0;
m_mlen=0;
}
}*/
m_buffer=malloc(len);
memcpy(m_buffer,pbuff,len);
m_dlen=len;
m_mlen=len;
}
void *GetBuff(){
return m_buffer;
};
unsigned int GetLen(){
return m_dlen;
}
//private:
void *m_buffer;
unsigned int m_mlen;
unsigned int m_dlen;
string m_cfname;
string m_cqname;
};
class CDLHTableInsertMutator
{
public:
CDLHTableInsertMutator(NamespacePtr namespace_ptr)
{
//cout << "this pointer: " << this << endl;
m_table_ptr=0;
m_namespace_ptr=namespace_ptr;
m_valuearr.reserve(1000000); //locate max_cell_count space
m_num = 0;
};
~CDLHTableInsertMutator(){
Commit();
Reset();
};
public:
void Reset()
{
m_cells.clear();
m_keyguidaerr.clear();
for(int i=0;i<m_valuearr.size();i++)
{
delete m_valuearr[i];
m_valuearr[i]=NULL;
}
m_valuearr.clear();
m_num=0;
}
bool Closetable()
{
Reset();
return true;
}
bool InsertCQ(string &rowkey,const char*CFName,const char*CQName,const void *value,int valuelen,
uint64_t timestamp=AUTO_ASSIGN)
{
if (0 == rowkey.length())
{
cout << "rowkey:" << rowkey << "|"<< "rowkey length: " << rowkey.length() << endl;
cout << "please checkup your rowkey construct valid!!!" << endl;
return false;
}
try{
//if(m_keyguidaerr.find(rowkey)==m_keyguidaerr.end())
//m_keyguidaerr[rowkey]=rowkey;
//m_valuearr[m_num].Release();
//m_valuearr[m_num].Save(value,valuelen);
m_keyguidaerr.push_back(rowkey);
Cellbuff *buf=new Cellbuff();
m_valuearr.push_back(buf);
m_valuearr[m_num]->Save(value,valuelen);
char *strCF=0;
char *strCQ=0;
if(CFName&&strlen(CFName))
{
m_valuearr[m_num]->m_cfname=CFName;
strCF=(char *)m_valuearr[m_num]->m_cfname.c_str();
}
else
{
return false;
}
if(CQName&&strlen(CQName))
{
m_valuearr[m_num]->m_cqname=CQName;
strCQ=(char *)m_valuearr[m_num]->m_cqname.c_str();
}
Cell cell(m_keyguidaerr[m_num].c_str(),strCF,strCQ,
timestamp,AUTO_ASSIGN,
(uint8_t*)m_valuearr[m_num]->GetBuff(),m_valuearr[m_num]->GetLen(),
FLAG_INSERT);
m_cells.push_back(cell);
m_num++;
}
catch (Exception &e)
{
HT_ERROR_OUT << e << HT_END;
return false;
}
return true;
}
bool Commit()
{
//cout <<"this pointer: "<< this << endl;
if(m_num==0)
{
//cout <<"Commit()++++++++++++++++++++++++++++++++++++:"<<endl;
//释放缓存
Reset();
//cout <<"Commit()--1 m_num:"<<m_num<<" keynum:"<<m_keyguidaerr.size()<<endl;
return true;
}
//cout <<"Commit()--2 m_num:"<<m_num<<" keynum:"<<m_keyguidaerr.size()<<endl;
//create the tablemutator
//TableMutator* mutator_ptr =0;
try{
if (m_table_ptr != 0)
{
//cout <<"m_table_ptr: "<<m_table_ptr<<endl;
TableMutatorPtr mutator_ptr = m_table_ptr->create_mutator();
if (mutator_ptr != 0)
{
//cout <<"mutator_ptr: "<<mutator_ptr<<endl;
//cout <<"mutator_ptr->set_cells--beg"<<endl;
mutator_ptr->set_cells(m_cells);
//cout <<"mutator_ptr->flush--beg"<<endl;
mutator_ptr->flush();
//cout <<"mutator_ptr->flush--end"<<endl;
}
}
//delete mutator_ptr;
//mutator_ptr = 0;
}
catch (Exception &e)
{
HT_ERROR_OUT << e << HT_END;
m_failinfo = e.what();
//释放缓存
Reset();
return false;
}
//释放缓存
Reset();
return true;
}
int GetCellnum(){return m_num;}
string GetCommitFailInfo() {return m_failinfo;}
private:
typedef intrusive_ptr<TableMutator> TableMutatorPtr;
int m_num;
TablePtr m_table_ptr;
NamespacePtr m_namespace_ptr;
Cells m_cells;
//std::map<string,string> m_keyguidaerr;
//std::map<unsigned int,Cellbuff> m_valuearr;
//unordered_map<string,string> m_keyguidaerr;
//unordered_map<unsigned int,Cellbuff> m_valuearr;
std::vector<string> m_keyguidaerr;
//std::vector<Cellbuff> m_valuearr;
std::vector<Cellbuff*> m_valuearr;
string m_failinfo;
};
#endif
原因:
vector 存储对象,reserve 的空间使用完后,扩展空间resize 实际使用的数据地址可能破坏。
总结:
vector 等容器类,建议存储指针,不存储对象。指针有内存分配,内存释放要手动维护。
温故而知新,复习STL 容器,加油↖(^ω^)↗!!!
847

被折叠的 条评论
为什么被折叠?



