How do I convert from "RTRProxyManagedVariable&" to "RTRProxyManagedVariablePtr"?

Hello there ,


Issue is memory leak in RMC API C++

OS is Red Hat Enterprise Linux Server 7.9, RMC API is rmc2.2.0.L1.linux.

The question is how do I convert from "RTRProxyManagedVariable&" to "RTRProxyManagedVariablePtr"?


In bool Monitor::addToList( const RTRProxyManagedVariablePtr var )

I store the RTRProxyManagedVariablePtr in a standard c++ vector


In the function void dropFromList(const RTRProxyManagedVariable& var)

A reference to a RTRProxyManagedVariable is passed not RTRProxyManagedVariablePtr

I can't figure out how to convert from RTRProxyManagedVariable toa RTRProxyManagedVariablePtr so that I can find it in my list so that I can drop the variable.


I have attached the code segments below...

Global variable
vector <RTRProxyManagedVariablePtr *> vecVarPtr;
bool Monitor::addToList( const RTRProxyManagedVariablePtr var )
{

RTRProxyManagedVariablePtr varPtr;
RTRBOOL variable_found = RTRFALSE; //used to ensure that the variables added in the same order as we see them
RTRProxyManagedVariablePtr *nPtr = new RTRProxyManagedVariablePtr;
*nPtr = var;
if(vecVarPtr.size() == 0)
vecVarPtr.push_back(nPtr);
else
{

for(size_t ix=0; ix< vecVarPtr.size(); ix++)
{

varPtr = *(vecVarPtr[ix]);
if (varPtr->error())
{

if (varPtr->hasClient(*this))
varPtr->dropClient(*this);
vecVarPtr.erase(vecVarPtr.begin()+ix);
return false;
}
if ( var->context().instanceId() == varPtr->context().instanceId() )
variable_found = RTRTRUE;
if ( ( variable_found ) && (var->context().instanceId() != varPtr->context().instanceId()) )
{

vecVarPtr.push_back(nPtr);
break;
}
}
}
return true;
}
void Monitor::dropFromList(const RTRProxyManagedVariable& var)
{
for(size_t ix=0; ix< vecVarPtr.size(); ix++)
{

RTRProxyManagedVariablePtr *varPtr = vecVarPtr[ix];
if ((unsigned long)&(*(*varPtr)) == (unsigned long)(&var))
{
vecVarPtr.erase(vecVarPtr.begin()+ix);
delete varPtr;
break;
}
}
}

Answers

  • @louis.louca

    Thank you for reaching out to us.

    I checked the header files and found that RTRProxyManagedVariablePtr is RTRObjRef<RTRProxyManagedVariable>. It is a smart pointer of RTRProxyManagedVariable.

    typedef RTRObjRef<RTRProxyManagedVariable> RTRProxyManagedVariablePtr;

    This is one of the constructors of RTRObjRef (gcref.h).

        // _TAG Constructor
        // A pointer to the object referenced by t.
        inline RTRObjRef(T& t)
            : _impl(&t)
        {
            if ( _impl )
                _impl->incrementCount();
        }

    Moreover, there are overloaded operators of RTRObjRef.

    // Operators

        // _TAG01 Operators
        inline T *operator->() const { return (T*)_impl; }


        // _TAG01 Operators
        inline T& operator*() const { return *_impl; }

    I hope that this information is of help.

  • Thanks for the reply, but it does not answer my question.

    I am unable to get rid of memory leak as I can't figure out how to compare RTRProxyManagedVariable& var with RTRProxyManagedVariablePtr var so that i can drop appropriate pointer as explained previously.

    Please look at the functions I supplied.

  • @louis.louca

    Please contact the API support team direclty via Contact Premium Support to verify the code and investigate this issue.

    If you are a Refinitiv Developer Connect named user, you will see the Contact Premium Support when logging on this page.

  • I clicked on the link provided but can't find the " Contact Premium Support" option on the page.

    1715325198824.png