Modern C++ API: Don’t Declare Entities As Pointers
Entities, such as the DomainParticipant or the DataReader should never be created as pointers (i.e. using new
). They already implement reference semantics and behave like a shared_ptr
. A DomainParticipant
(or any other reference type in the API) is a wrapper of shared_ptr<DomainParticipantImpl>
.
Whenever you declare an Entity, as a class member, a local variable, etc., declare it as a regular variable, for example:
class MyClass { ... // Correct declaration: DomainParticipant my_participant; // Don’t do this: // DomainParticipant * my_participant; // nor this: // shared_ptr<DomainParticipant> my_participant; };
This may force you to call a DomainParticipant
constructor in the constructors of MyClass
, for example:
class MyClass { public: MyClass(int domain_id) : my_participant(domain_id) { } private: DomainParticipant my_participant; };
But if for some reason you can’t create the object right there, you can use the constructor that receives dds::core::null
(or nullptr
in C++11) and create the actual DomainParticipant
later:
class MyClass { public: MyClass() : my_participant(nullptr) { } int create_participant(int domain_id) { // Creates the DomainParticipant and assigns the reference // to my_participant. After this assignment, this DomainParticipant's // reference count is 1. my_participant = DomainParticipant(domain_id); } private: DomainParticipant my_participant; };
Note that the DomainParticipant
will be automatically deleted by MyClass
's implicit destructor, since we are not holding any other references to it other than my_participant
.