summaryrefslogtreecommitdiff
path: root/TAO/tao/Managed_Types.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/Managed_Types.cpp')
-rw-r--r--TAO/tao/Managed_Types.cpp24
1 files changed, 20 insertions, 4 deletions
diff --git a/TAO/tao/Managed_Types.cpp b/TAO/tao/Managed_Types.cpp
index 5c2b8ed152f..1334d4ac165 100644
--- a/TAO/tao/Managed_Types.cpp
+++ b/TAO/tao/Managed_Types.cpp
@@ -10,12 +10,20 @@ ACE_RCSID (tao,
Managed_Types,
"$Id$")
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
// assignment from CORBA::String_var makes a copy
TAO_String_Manager&
TAO_String_Manager::operator= (const CORBA::String_var &var)
{
- CORBA::string_free (this->ptr_);
- this->ptr_ = CORBA::string_dup (var.in ());
+ // Strongly exception safe by means of copy and non-throwing swap
+ // technique.
+ TAO_String_Manager tmp (var.in ());
+
+ char * old_ptr = this->ptr_;
+ this->ptr_ = tmp.ptr_;
+ tmp.ptr_ = old_ptr;
+
return *this;
}
@@ -38,8 +46,14 @@ TAO_SeqElem_String_Manager::operator= (const CORBA::String_var &var)
TAO_WString_Manager&
TAO_WString_Manager::operator= (const CORBA::WString_var &var)
{
- CORBA::wstring_free (this->ptr_);
- this->ptr_ = CORBA::wstring_dup (var.in ());
+ // Strongly exception safe by means of copy and non-throwing swap
+ // technique.
+ TAO_WString_Manager tmp (var.in ());
+
+ CORBA::WChar * old_ptr = this->ptr_;
+ this->ptr_ = tmp.ptr_;
+ tmp.ptr_ = old_ptr;
+
return *this;
}
@@ -55,3 +69,5 @@ TAO_SeqElem_WString_Manager::operator= (const CORBA::WString_var &var)
*this->ptr_ = CORBA::wstring_dup (var.in ());
return *this;
}
+
+TAO_END_VERSIONED_NAMESPACE_DECL