question

Upvotes
1 0 0 1

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;
}
}
}
trep#technologyc++monitoring
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvotes
80.1k 257 52 75

@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.

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvotes
1 0 0 1

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.

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

@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.

Upvotes
1 0 0 1

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

1715325198824.png


1715325198824.png (115.1 KiB)
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Write an Answer

Hint: Notify or tag a user in this post by typing @username.

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.