From b43bca39dacac6ac7530b416790bf23b40080e0f Mon Sep 17 00:00:00 2001
From: Fabian Reister <fabian.reister@kit.edu>
Date: Fri, 27 May 2022 09:19:46 +0200
Subject: [PATCH] using std::vector instead of raw array

---
 VirtualRobot/SceneObject.cpp  | 22 ++++++++++++----------
 VirtualRobot/XML/ObjectIO.cpp | 13 +++----------
 2 files changed, 15 insertions(+), 20 deletions(-)

diff --git a/VirtualRobot/SceneObject.cpp b/VirtualRobot/SceneObject.cpp
index 4fa1bbe8f..3d46ae106 100644
--- a/VirtualRobot/SceneObject.cpp
+++ b/VirtualRobot/SceneObject.cpp
@@ -1466,26 +1466,28 @@ namespace VirtualRobot
         if (!collisionModelXML.empty())
         {
             rapidxml::xml_document<> doc;
-            char* cstr = new char[collisionModelXML.size() + 1];  // Create char buffer to store string copy
-            strcpy(cstr, collisionModelXML.c_str());             // Copy string into char buffer
-            doc.parse<0>(cstr);
+            
+            std::vector<char> cstr(collisionModelXML.size() + 1);  // Create char buffer to store string copy
+            strcpy(cstr.data(), collisionModelXML.c_str());             // Copy string into char buffer
+            doc.parse<0>(cstr.data());
             collisionModel = BaseIO::processCollisionTag(doc.first_node(), name, basePath);
-            if (collisionModel && scaling != 1.0f) collisionModel = collisionModel->clone(collisionChecker, scaling);
-            delete[] cstr;
+            if (collisionModel && scaling != 1.0f) { 
+                collisionModel = collisionModel->clone(collisionChecker, scaling);
+            }
             reloaded = true;
         }
         if (!visualizationModelXML.empty())
         {
             rapidxml::xml_document<> doc;
-            char* cstr = new char[visualizationModelXML.size() + 1];  // Create char buffer to store string copy
-            strcpy(cstr, visualizationModelXML.c_str());             // Copy string into char buffer
-            doc.parse<0>(cstr);
+            std::vector<char> cstr(collisionModelXML.size() + 1);  // Create char buffer to store string copy
+            strcpy(cstr.data(), visualizationModelXML.c_str());             // Copy string into char buffer
+            doc.parse<0>(cstr.data());
             bool useAsColModel;
             visualizationModel = BaseIO::processVisualizationTag(doc.first_node(), name, basePath, useAsColModel);
             if (visualizationModel && scaling != 1.0f) visualizationModel = visualizationModel->clone(true, scaling);
-            if (visualizationModel && collisionModel == nullptr && (useVisAsColModelIfMissing || useAsColModel))
+            if (visualizationModel && collisionModel == nullptr && (useVisAsColModelIfMissing || useAsColModel)) {
                 collisionModel.reset(new CollisionModel(visualizationModel->clone(true), getName() + "_VISU_ColModel", CollisionCheckerPtr()));
-            delete[] cstr;
+            }
             reloaded = true;
         }
         for (auto child : this->getChildren()) {
diff --git a/VirtualRobot/XML/ObjectIO.cpp b/VirtualRobot/XML/ObjectIO.cpp
index 2434027ba..c47299a9a 100644
--- a/VirtualRobot/XML/ObjectIO.cpp
+++ b/VirtualRobot/XML/ObjectIO.cpp
@@ -245,25 +245,22 @@ namespace VirtualRobot
     VirtualRobot::ManipulationObjectPtr ObjectIO::createManipulationObjectFromString(const std::string& xmlString, const std::string& basePath /*= ""*/)
     {
         // copy string content to char array
-        char* y = new char[xmlString.size() + 1];
-        strncpy(y, xmlString.c_str(), xmlString.size() + 1);
+        std::vector<char> y(xmlString.size() + 1);
+        strncpy(y.data(), xmlString.c_str(), xmlString.size() + 1);
 
         VirtualRobot::ManipulationObjectPtr obj;
 
         try
         {
             rapidxml::xml_document<char> doc;    // character type defaults to char
-            doc.parse<0>(y);    // 0 means default parse flags
+            doc.parse<0>(y.data());    // 0 means default parse flags
             rapidxml::xml_node<char>* objectXMLNode = doc.first_node("ManipulationObject");
 
             obj = processManipulationObject(objectXMLNode, basePath);
 
-
-
         }
         catch (rapidxml::parse_error& e)
         {
-            delete[] y;
             THROW_VR_EXCEPTION("Could not parse data in xml definition" << endl
                                << "Error message:" << e.what() << endl
                                << "Position: " << endl << e.where<char>() << endl);
@@ -272,24 +269,20 @@ namespace VirtualRobot
         catch (VirtualRobot::VirtualRobotException&)
         {
             // rethrow the current exception
-            delete[] y;
             throw;
         }
         catch (std::exception& e)
         {
-            delete[] y;
             THROW_VR_EXCEPTION("Error while parsing xml definition" << endl
                                << "Error code:" << e.what() << endl);
             return ManipulationObjectPtr();
         }
         catch (...)
         {
-            delete[] y;
             THROW_VR_EXCEPTION("Error while parsing xml definition" << endl);
             return ManipulationObjectPtr();
         }
 
-        delete[] y;
         return obj;
     }
 
-- 
GitLab