On Wed, Jun 2, 2010 at 12:13 PM, Matthieu Kermagoret
<[email protected]> wrote:
> So I tried to patch the code to correct this behavior and it _seems_
> to work (no leak, no faulty memory access, and of course correct
> behavior). What do you think about it ?
>

My bad, patch is corrupted. Correct one attached.

Best regards,

-- 
Matthieu KERMAGORET | Développeur

[email protected]

MERETHIS est éditeur du logiciel Centreon.
diff --git a/src/core/statement.cpp b/src/core/statement.cpp
index 738ef6f..49e239a 100644
--- a/src/core/statement.cpp
+++ b/src/core/statement.cpp
@@ -123,6 +123,10 @@ void statement_impl::bind(values & values)
 
             cnt++;
         }
+        for (std::size_t i = selfUsesSize_; i != uses_.size(); ++i)
+        {
+            uses_[i]->pre_use();
+        }
     }
     catch (...)
     {
@@ -532,8 +536,8 @@ void statement_impl::pre_fetch()
 
 void statement_impl::pre_use()
 {
-    std::size_t const usize = uses_.size();
-    for (std::size_t i = 0; i != usize; ++i)
+    selfUsesSize_ = uses_.size();
+    for (std::size_t i = 0; i != selfUsesSize_; ++i)
     {
         uses_[i]->pre_use();
     }
@@ -566,6 +570,8 @@ void statement_impl::post_use(bool gotData)
     {
         uses_[i-1]->post_use(gotData);
     }
+    indicators_.resize(0);
+    uses_.resize(selfUsesSize_);
 }
 
 namespace soci
diff --git a/src/core/statement.h b/src/core/statement.h
index b898a65..528339a 100644
--- a/src/core/statement.h
+++ b/src/core/statement.h
@@ -79,6 +79,7 @@ protected:
 private:
 
     int refCount_;
+    std::size_t selfUsesSize_;
 
     row * row_;
     std::size_t fetchSize_;
diff --git a/src/core/values-exchange.h b/src/core/values-exchange.h
index 249a601..1adc227 100644
--- a/src/core/values-exchange.h
+++ b/src/core/values-exchange.h
@@ -45,19 +45,23 @@ public:
 
     virtual void bind(details::statement_impl & st, int & /*position*/)
     {
+        st_ = &st;
         v_.uppercase_column_names(st.session_.get_uppercase_column_names());
-
-        convert_to_base();
-        st.bind(v_);
     }
 
     virtual void post_use(bool /*gotData*/)
     {
         v_.reset_get_counter();
         convert_from_base();
+        v_.clean_up();
+    }
+
+    virtual void pre_use()
+    {
+        convert_to_base();
+        st_->bind(v_);
     }
 
-    virtual void pre_use() {}
     virtual void clean_up() {v_.clean_up();}
     virtual std::size_t size() const { return 1; }
 
@@ -68,6 +72,7 @@ public:
     virtual void convert_from_base() {}
 
 private:
+    details::statement_impl * st_;
     values & v_;
 };
 
diff --git a/src/core/values.h b/src/core/values.h
index 351c79b..61811b3 100644
--- a/src/core/values.h
+++ b/src/core/values.h
@@ -312,20 +312,28 @@ private:
         delete row_;
         row_ = NULL;
 
-        // delete any uses and indicators which were created  by set() but
-        // were not bound by the Statement
-        // (bound uses and indicators are deleted in Statement::clean_up())
-        for (std::map<details::use_type_base *, indicator *>::iterator pos =
-            unused_.begin(); pos != unused_.end(); ++pos)
+        // delete any uses and indicators which were created  by set()
+        for (std::vector<details::standard_use_type *>::iterator it =
+             uses_.begin(); it != uses_.end(); ++it)
         {
-            delete pos->first;
-            delete pos->second;
+          delete *it;
         }
+        uses_.clear();
+
+        for (std::vector<indicator *>::iterator it = indicators_.begin();
+             it != indicators_.end(); ++it)
+        {
+            delete *it;
+        }
+        indicators_.clear();
 
         for (std::size_t i = 0; i != deepCopies_.size(); ++i)
         {
             delete deepCopies_[i];
         }
+        deepCopies_.clear();
+
+        unused_.clear();
     }
 };
 
------------------------------------------------------------------------------

_______________________________________________
Soci-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/soci-users

Reply via email to