]> granicus.if.org Git - icu/commitdiff
ICU-8673 Get rid of memcpy() of an object in RuleBasedBreakIterator::createBufferClone()
authorAndy Heninger <andy.heninger@gmail.com>
Wed, 29 Jun 2011 23:41:05 +0000 (23:41 +0000)
committerAndy Heninger <andy.heninger@gmail.com>
Wed, 29 Jun 2011 23:41:05 +0000 (23:41 +0000)
X-SVN-Rev: 30255

icu4c/source/common/rbbi.cpp

index 35c58053d958fdc472ab2c9c476b39a8dbd67b35..b5c6cb8af5d81df5a3b59a3ba7211dc5e00af689 100644 (file)
@@ -1565,19 +1565,8 @@ BreakIterator *  RuleBasedBreakIterator::createBufferClone(void *stackBuffer,
 
     //
     //  Clone the source BI into the caller-supplied buffer.
-    //    TODO:  using an overloaded operator new to directly initialize the
-    //           copy in the user's buffer would be better, but it doesn't seem
-    //           to get along with namespaces.  Investigate why.
     //
-    //           The memcpy is only safe with an empty (default constructed)
-    //           break iterator.  Use on others can screw up reference counts
-    //           to data.  memcpy-ing objects is not really a good idea...
-    //
-    RuleBasedBreakIterator localIter;        // Empty break iterator, source for memcpy
-    RuleBasedBreakIterator *clone = (RuleBasedBreakIterator *)buf;
-    uprv_memcpy(clone, &localIter, sizeof(RuleBasedBreakIterator)); // init C++ gorp, BreakIterator base class part
-    clone->init();                // Init RuleBasedBreakIterator part, (user default constructor)
-    *clone = *this;               // clone = the real BI we want.
+    RuleBasedBreakIterator *clone = new(buf) RuleBasedBreakIterator(*this);
     clone->fBufferClone = TRUE;   // Flag to prevent deleting storage on close (From C code)
 
     return clone;