Andrew Peter Marlow created AVRO-3730:
-----------------------------------------

             Summary: avrogencpp generated structs do not inherit from a common 
base class and so cannot be generically destructed
                 Key: AVRO-3730
                 URL: https://issues.apache.org/jira/browse/AVRO-3730
             Project: Apache Avro
          Issue Type: Improvement
          Components: c++
    Affects Versions: 1.11.1
         Environment: This applies to all environments but was spotted on RHEL8 
using gcc 8.5.0.
            Reporter: Andrew Peter Marlow


Objects of the type generated by avrogencpp are structs which might not be 
PODs, since they might contain std::string and/or std::any. This means that 
when they are constructed by a custom allocator they have to be destructed by 
the compiler-generated destructor otherwise the non-POD memory remains 
allocated. This requires that the type is known. A more flexible approach would 
be for all these structs to inherit from a common base class with a virtual 
destructor. This would allow any such object to be destructed by invoking that 
common destructor.

This issue was brought to light on a project that uses a custom allocator that 
hands out object from a  pool and requires that they are returned to the pool 
when they are finished with. The code is generic, the avro message is just a 
block of bytes so there is no type information. That works ok for many of the 
messages which just contain various integers. It even works ok in some cases 
where the structs have std::string and/or std::any when the data fits into the 
small buffer optimisation. However, it leaks when the struct has used the heap.

One fix would be to add a base class, let's call it AvroBaseStruct, which has a 
pure virtual destructor. It would be declared in the avro namespace in the 
header Specific.hh since the generated code already includes that header. The 
base class destructor would have an inline implementation in the header file. 
All generated headers would publically inherit from that class. 

The size of derived classes should not change due to the empty base class 
optimisation. There will need to be documentation to let people know that avro 
objects can be deleted polymorphically. So AvroBaseStruct will have to be 
documented somehow.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to