解决SOCI 3.2.1的内存泄漏问题

     使用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;
		}
    }
}
 

你可能感兴趣的:(数据库,SOCI)