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    
}
第2セグメントの元のコード:
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;
		}
    }
}