C++ Mathematical Expression Library (ExprTk)  https://www.partow.net/programming/exprtk/index.html
diff --git a/exprtk.hpp b/exprtk.hpp
index c865833..8320539 100644
--- a/exprtk.hpp
+++ b/exprtk.hpp
@@ -4270,12 +4270,19 @@
       }
 
       #ifdef exprtk_enable_debugging
-      inline void dump_ptr(const std::string& s, const void* ptr)
+      inline void dump_ptr(const std::string& s, const void* ptr, const std::size_t size = 0)
       {
-         exprtk_debug(("%s - addr: %p\n",s.c_str(),ptr));
+         if (size)
+            exprtk_debug(("%s - addr: %p\n",s.c_str(),ptr));
+         else
+            exprtk_debug(("%s - addr: %p size: %d\n",
+                          s.c_str(),
+                          ptr,
+                          static_cast<unsigned int>(size)));
       }
       #else
       inline void dump_ptr(const std::string&, const void*) {}
+      inline void dump_ptr(const std::string&, const void*, const std::size_t) {}
       #endif
 
       template <typename T>
@@ -4294,7 +4301,7 @@
             : ref_count(1),
               size     (0),
               data     (0),
-              destruct (false)
+              destruct (true)
             {}
 
             control_block(const std::size_t& dsize)
@@ -4365,7 +4372,7 @@
                destruct = true;
                data     = new T[size];
                std::fill_n(data,size,T(0));
-               dump_ptr("control_block::create_data() - data: ",data);
+               dump_ptr("control_block::create_data() - data",data,size);
             }
          };
 
@@ -4375,8 +4382,12 @@
          : control_block_(control_block::create(0))
          {}
 
-         vec_data_store(const std::size_t& size, data_t data = data_t(0), bool dstrct = false)
-         : control_block_(control_block::create(size,data,dstrct))
+         vec_data_store(const std::size_t& size)
+         : control_block_(control_block::create(size,(data_t)(0),true))
+         {}
+
+         vec_data_store(const std::size_t& size, data_t data, bool dstrct = false)
+         : control_block_(control_block::create(size, data, dstrct))
          {}
 
          vec_data_store(const type& vds)
@@ -4396,11 +4407,16 @@
             {
                std::size_t final_size = min_size(control_block_, vds.control_block_);
 
-               control_block::destroy(control_block_);
+               vds.control_block_->size = final_size;
+                   control_block_->size = final_size;
 
-               control_block_ = vds.control_block_;
-               control_block_->ref_count++;
-               control_block_->size = final_size;
+               if (control_block_->destruct || (0 == control_block_->data))
+               {
+                  control_block::destroy(control_block_);
+
+                  control_block_ = vds.control_block_;
+                  control_block_->ref_count++;
+               }
             }
 
             return *this;
@@ -6627,7 +6643,7 @@
 
          virtual vector_node_ptr vec() const = 0;
 
-         virtual vector_node_ptr vec() = 0;
+         virtual vector_node_ptr vec()       = 0;
 
          virtual       vds_t& vds   ()       = 0;
 
@@ -6649,10 +6665,10 @@
 
          vector_node(vector_holder_t* vh)
          : vector_holder_(vh),
-           vds_(ref().size(),ref()[0])
+           vds_((*vector_holder_).size(),(*vector_holder_)[0])
          {}
 
-         vector_node(vector_holder_t* vh, const vds_t& vds)
+         vector_node(const vds_t& vds, vector_holder_t* vh)
          : vector_holder_(vh),
            vds_(vds)
          {}
@@ -6662,16 +6678,6 @@
             return vds().data()[0];
          }
 
-         inline const vector_holder_t& ref() const
-         {
-            return (*vector_holder_);
-         }
-
-         inline vector_holder_t& ref()
-         {
-            return (*vector_holder_);
-         }
-
          vector_node_ptr vec() const
          {
             return const_cast<vector_node_ptr>(this);
@@ -6702,6 +6708,11 @@
             return vds_;
          }
 
+         inline vector_holder_t& vec_holder()
+         {
+            return (*vector_holder_);
+         }
+
       private:
 
          vector_holder_t* vector_holder_;
@@ -6941,8 +6952,8 @@
 
             if (vec0_node_ptr_ && vec1_node_ptr_)
             {
-               vec_size_ = std::min(vec0_node_ptr_->ref().size(),
-                                    vec1_node_ptr_->ref().size());
+               vec_size_ = std::min(vec0_node_ptr_->vds().size(),
+                                    vec1_node_ptr_->vds().size());
 
                initialised_ = true;
             }
@@ -6955,8 +6966,8 @@
                binary_node<T>::branch_[0].first->value();
                binary_node<T>::branch_[1].first->value();
 
-               T* vec0 = vec0_node_ptr_->ref().data();
-               T* vec1 = vec1_node_ptr_->ref().data();
+               T* vec0 = vec0_node_ptr_->vds().data();
+               T* vec1 = vec1_node_ptr_->vds().data();
 
                for (std::size_t i = 0; i < vec_size_; ++i)
                {
@@ -9462,8 +9473,8 @@
                binary_node<T>::branch_[0].first->value();
                binary_node<T>::branch_[1].first->value();
 
-               T* vec0 = vec0_node_ptr_->ref().data();
-               T* vec1 = vec1_node_ptr_->ref().data();
+               T* vec0 = vec0_node_ptr_->vds().data();
+               T* vec1 = vec1_node_ptr_->vds().data();
 
                loop_unroll::details lud(size());
                const T* upper_bound = vec0 + lud.upper_bound;
@@ -9615,8 +9626,8 @@
 
             if (vec0_node_ptr_ && vec1_node_ptr_)
             {
-               vector_holder<T>& vec0 = vec0_node_ptr_->ref();
-               vector_holder<T>& vec1 = vec1_node_ptr_->ref();
+               vector_holder<T>& vec0 = vec0_node_ptr_->vec_holder();
+               vector_holder<T>& vec1 = vec1_node_ptr_->vec_holder();
 
                if (v0_is_ivec && (vec0.size() <= vec1.size()))
                   vds_ = vds_t(vec0_node_ptr_->vds());
@@ -9626,7 +9637,7 @@
                   vds_ = vds_t(std::min(vec0.size(),vec1.size()));
 
                temp_          = new vector_holder<T>(vds().data(),vds().size());
-               temp_vec_node_ = new vector_node<T>  (temp_,vds());
+               temp_vec_node_ = new vector_node<T>  (vds(),temp_);
 
                initialised_ = true;
             }
@@ -9645,8 +9656,8 @@
                binary_node<T>::branch_[0].first->value();
                binary_node<T>::branch_[1].first->value();
 
-               T* vec0 = vec0_node_ptr_->ref().data();
-               T* vec1 = vec1_node_ptr_->ref().data();
+               T* vec0 = vec0_node_ptr_->vds().data();
+               T* vec1 = vec1_node_ptr_->vds().data();
                T* vec2 = vds().data();
 
                loop_unroll::details lud(size());
@@ -9780,12 +9791,12 @@
             if (vec0_node_ptr_)
             {
                if (v0_is_ivec)
-                  vds_        = vec0_node_ptr_->vds();
+                  vds() = vec0_node_ptr_->vds();
                else
-                  vds_        = vds_t(vec0_node_ptr_->size());
+                  vds() = vds_t(vec0_node_ptr_->size());
 
                temp_          = new vector_holder<T>(vds());
-               temp_vec_node_ = new vector_node<T>  (temp_);
+               temp_vec_node_ = new vector_node<T>  (vds(),temp_);
             }
          }
 
@@ -9802,7 +9813,7 @@
                            binary_node<T>::branch_[0].first->value();
                const T v = binary_node<T>::branch_[1].first->value();
 
-               T* vec0 = vec0_node_ptr_->ref().data();
+               T* vec0 = vec0_node_ptr_->vds().data();
                T* vec1 = vds().data();
 
                loop_unroll::details lud(size());
@@ -9933,12 +9944,12 @@
             if (vec1_node_ptr_)
             {
                if (v1_is_ivec)
-                  vds_ = vec1_node_ptr_->vds();
+                  vds() = vec1_node_ptr_->vds();
                else
-                  vds_ = vds_t(vec1_node_ptr_->size());
+                  vds() = vds_t(vec1_node_ptr_->size());
 
-               temp_          = new vector_holder<T>(      vds());
-               temp_vec_node_ = new vector_node<T>  (temp_,vds());
+               temp_          = new vector_holder<T>(vds());
+               temp_vec_node_ = new vector_node<T>  (vds(),temp_);
             }
          }
 
@@ -9956,7 +9967,7 @@
                            binary_node<T>::branch_[1].first->value();
 
                T* vec0 = vds().data();
-               T* vec1 = vec1_node_ptr_->ref().data();
+               T* vec1 = vec1_node_ptr_->vds().data();
 
                loop_unroll::details lud(size());
                const T* upper_bound = vec0 + lud.upper_bound;
@@ -10089,7 +10100,7 @@
                   vds_ = vds_t(vec0_node_ptr_->size());
 
                temp_          = new vector_holder<T>(vds());
-               temp_vec_node_ = new vector_node<T>  (temp_);
+               temp_vec_node_ = new vector_node<T>  (vds(),temp_);
             }
          }
 
@@ -10105,7 +10116,7 @@
 
             if (vec0_node_ptr_)
             {
-               T* vec0 = vec0_node_ptr_->ref().data();
+               T* vec0 = vec0_node_ptr_->vds().data();
                T* vec1 = vds().data();
 
                loop_unroll::details lud(size());
@@ -12058,8 +12069,8 @@
 
          static inline T process(const ivector_ptr v)
          {
-            const T* vec = v->vec()->ref().data();
-            const std::size_t vec_size = v->vec()->ref().size();
+            const T* vec = v->vec()->vds().data();
+            const std::size_t vec_size = v->vec()->vds().size();
 
             loop_unroll::details lud(vec_size);
 
@@ -12155,8 +12166,8 @@
 
          static inline T process(const ivector_ptr v)
          {
-            const T* vec = v->vec()->ref().data();
-            const std::size_t vec_size = v->vec()->ref().size();
+            const T* vec = v->vec()->vds().data();
+            const std::size_t vec_size = v->vec()->vds().size();
 
             loop_unroll::details lud(vec_size);
 
@@ -12252,7 +12263,7 @@
 
          static inline T process(const ivector_ptr v)
          {
-            const std::size_t vec_size = v->vec()->ref().size();
+            const std::size_t vec_size = v->vec()->vds().size();
 
             return vec_add_op<T>::process(v) / vec_size;
          }
@@ -12265,8 +12276,8 @@
 
          static inline T process(const ivector_ptr v)
          {
-            const T* vec = v->vec()->ref().data();
-            const std::size_t vec_size = v->vec()->ref().size();
+            const T* vec = v->vec()->vds().data();
+            const std::size_t vec_size = v->vec()->vds().size();
 
             T result = vec[0];
 
@@ -12289,8 +12300,8 @@
 
          static inline T process(const ivector_ptr v)
          {
-            const T* vec = v->vec()->ref().data();
-            const std::size_t vec_size = v->vec()->ref().size();
+            const T* vec = v->vec()->vds().data();
+            const std::size_t vec_size = v->vec()->vds().size();
 
             T result = vec[0];
 
@@ -26040,7 +26051,7 @@
                case e_st_vector   : {
                                        typedef details::vector_holder<T> vector_holder_t;
 
-                                       vector_holder_t& vh = static_cast<vector_node_t*>(node)->ref();
+                                       vector_holder_t& vh = static_cast<vector_node_t*>(node)->vec_holder();
 
                                        symbol_name = parser_->symtab_store_.get_vector_name(&vh);
                                     }
@@ -34580,9 +34591,9 @@
    namespace information
    {
       static const char* library = "Mathematical Expression Toolkit";
-      static const char* version = "2.718281828459045235360287471352662497"
-                                   "75724709369995957496696762772407663035";
-      static const char* date    = "20160909";
+      static const char* version = "2.71828182845904523536028747135266249775"
+                                   "7247093699959574966967627724076630353547";
+      static const char* date    = "20161010";
 
       static inline std::string data()
       {