scripts/wrap/cpp.py: use virtual destructor in all SWIG Director classes.
authorJulian Smith <[email protected]>
Thu, 9 Jan 2025 22:26:47 +0000 (22:26 +0000)
committerSebastian Rasmussen <[email protected]>
Fri, 24 Jan 2025 17:10:33 +0000 (18:10 +0100)
Fixes C++ compile warnings and errors from latest valgrind.

scripts/wrap/cpp.py

index d672df8dcb5d095d3f3722d1754208fbbe9bb286..56b7eac4269be10dc02f7d77a198100ee5883f0b 100644 (file)
@@ -4065,24 +4065,25 @@ def class_wrapper_virtual_fnptrs(
     out_cpp.write('    #endif\n')
     out_cpp.write( '}\n')
 
+    # Destructor. This needs to be virtual with an empty implementation,
+    # because instances will generally be derived classes.
+    out_h.write( '\n')
+    out_h.write( '    /** == Destructor. */\n')
+    out_h.write(f'    FZ_FUNCTION virtual ~{classname}2();\n')
+    out_cpp.write('\n')
+    out_cpp.write(f'FZ_FUNCTION {classname}2::~{classname}2()\n')
+    out_cpp.write( '{\n')
+    out_cpp.write(f'    {trace_if}\n')
+    out_cpp.write(f'    if (s_trace_director)\n')
+    out_cpp.write( '    {\n')
+    out_cpp.write(f'        std::cerr << __FILE__ << ":" << __LINE__ << ":" << __FUNCTION__ << ": ~{classname}2(): this=" << this << "\\n";\n')
+    if not extras.pod:
+        out_cpp.write( f'        std::cerr << __FILE__ << ":" << __LINE__ << ":" << __FUNCTION__ << ": ~{classname}2(): m_internal=" << m_internal << "\\n";\n')
+    out_cpp.write( '    }\n')
+    out_cpp.write(f'    #endif\n')
     if free:
-        # Destructor
-        out_h.write( '\n')
-        out_h.write( '    /** == Destructor. */\n')
-        out_h.write(f'    FZ_FUNCTION ~{classname}2();\n')
-        out_cpp.write('\n')
-        out_cpp.write(f'FZ_FUNCTION {classname}2::~{classname}2()\n')
-        out_cpp.write( '{\n')
-        out_cpp.write(f'    {trace_if}\n')
-        out_cpp.write(f'    if (s_trace_director)\n')
-        out_cpp.write( '    {\n')
-        out_cpp.write(f'        std::cerr << __FILE__ << ":" << __LINE__ << ":" << __FUNCTION__ << ": ~{classname}2(): this=" << this << "\\n";\n')
-        if not extras.pod:
-            out_cpp.write( f'        std::cerr << __FILE__ << ":" << __LINE__ << ":" << __FUNCTION__ << ": ~{classname}2(): m_internal=" << m_internal << "\\n";\n')
-        out_cpp.write( '    }\n')
-        out_cpp.write(f'    #endif\n')
         out_cpp.write(f'    {free}\n')
-        out_cpp.write( '}\n')
+    out_cpp.write( '}\n')
 
     def write(text):
         out_h.write(text)