Fix memory leak in process_value().
diff --git a/systemverilog-plugin/UhdmAst.cc b/systemverilog-plugin/UhdmAst.cc
index 0997aa3..dcf9757 100644
--- a/systemverilog-plugin/UhdmAst.cc
+++ b/systemverilog-plugin/UhdmAst.cc
@@ -1537,24 +1537,29 @@
         }
         vpi_release_handle(typespec_h);
     }
+    std::string val_str;
     if (val.format) { // Needed to handle parameter nodes without typespecs and constants
         switch (val.format) {
         case vpiScalarVal:
             return AST::AstNode::mkconst_int(val.value.scalar, false, 1);
         case vpiBinStrVal: {
             strValType += "b";
+            val_str = val.value.str;
             break;
         }
         case vpiDecStrVal: {
             strValType += "d";
+            val_str = val.value.str;
             break;
         }
         case vpiHexStrVal: {
             strValType += "h";
+            val_str = val.value.str;
             break;
         }
         case vpiOctStrVal: {
             strValType += "o";
+            val_str = val.value.str;
             break;
         }
         // Surelog reports constant integers as a unsigned, but by default int is signed
@@ -1563,16 +1568,14 @@
             if (val.value.uint > std::numeric_limits<std::uint32_t>::max()) {
                 // an integer is by default signed, so use 'sd despite the variant vpiUIntVal
                 strValType = "'sd";
-                string str_value = std::to_string(val.value.uint);
-                val.value.str = strdup(str_value.c_str());
+                val_str = std::to_string(val.value.uint);
                 break;
             }
             [[fallthrough]];
         case vpiIntVal: {
             if (val.value.integer > std::numeric_limits<std::int32_t>::max()) {
                 strValType = "'sd";
-                string str_value = std::to_string(val.value.integer);
-                val.value.str = strdup(str_value.c_str());
+                val_str = std::to_string(val.value.integer);
                 break;
             }
 
@@ -1626,8 +1629,8 @@
             vpi_release_handle(caseItem_h);
         }
         // handle vpiBinStrVal, vpiDecStrVal and vpiHexStrVal
-        if (std::strchr(val.value.str, '\'')) {
-            return ::systemverilog_plugin::const2ast(val.value.str, caseType, false);
+        if (val_str.find('\'') != std::string::npos) {
+            return ::systemverilog_plugin::const2ast(std::move(val_str), caseType, false);
         } else {
             auto size = vpi_get(vpiSize, obj_h);
             std::string size_str;
@@ -1643,7 +1646,7 @@
                     size_str = "1";
                 }
             }
-            auto c = ::systemverilog_plugin::const2ast(size_str + strValType + val.value.str, caseType, false);
+            auto c = ::systemverilog_plugin::const2ast(size_str + strValType + val_str, caseType, false);
             if (size <= 0) {
                 // unsized unbased const
                 c->is_unsized = true;