使用SOCI接口,果然很高效,尤其使用bulk操作。从SOCI的思路上是比较有创意的,但是在C++的内存管理细节上有些疏忽,有些动态内存变量在释放前没有做好空指针检查,有时会触发重复释放内存而崩溃。如:我在bulk insert操作中,就发现内存泄漏问题。经过对core代码追踪,发现在多次绑定数据时,重复创建backEnd_对象;后来又发现了backends目录下Postgresql代码存在内存泄漏问题。以下为修正内存泄漏方法
一、解决core的内存泄漏
源文件:use-type.cpp
第一段原代码:
vector_use_type::~vector_use_type()
{
delete backEnd_;
}
修改后代码:
vector_use_type::~vector_use_type()
{
if(backEnd_!=NULL) // 增加检查,提高安全性
delete backEnd_; // 原没有if语句限制
}
第二段原代码:
void vector_use_type::bind(statement_impl & st, int & position)
{
backEnd_ = st.make_vector_use_type_backend();
if (name_.empty())
{
backEnd_->bind_by_pos(position, data_, type_);
}
else
{
backEnd_->bind_by_name(name_, data_, type_);
}
}
修改后代码:
void vector_use_type::bind(statement_impl & st, int & position)
{
if(backEnd_!=NULL) // 增加检查,提防内存泄漏
delete backEnd_; // 增加
backEnd_ = st.make_vector_use_type_backend();
if (name_.empty())
{
backEnd_->bind_by_pos(position, data_, type_);
}
else
{
backEnd_->bind_by_name(name_, data_, type_);
}
}
二、解决backends下postgresql的内存泄漏
源文件:vector-use-type.cpp
原代码:
void postgresql_vector_use_type_backend::clean_up()
{
std::size_t const bsize = buffers_.size();
for (std::size_t i = 0; i != bsize; ++i)
{
delete [] buffers_[i];
}
}
修改后代码:
void postgresql_vector_use_type_backend::clean_up()
{
std::size_t const bsize = buffers_.size();
for (std::size_t i = 0; i != bsize; ++i)
{
if(buffers_[i]){
delete [] buffers_[i];
buffers_[i] = NULL;
}
}
}