I have this sample code(smaller version of the actual project) where we were seeing memory leak due to memory getting allocated dynamically in the constructor(also implicit constructor calls making it more problematic in the project) and not deallocated. So I just tried writing a smaller version and deallocate memory in the destructor, but program terminates due to double free.
using namespace std;
class UDPCPChecksum
{
int A;
int B;
};
class UDPCPMessage
{
UDPCPChecksum * _udpcpChecksum;
int A;
public:
UDPCPMessage();
UDPCPMessage(const std::string& msg);
~UDPCPMessage(){
cout<<"trying to delete"<<endl;
if(_udpcpChecksum !=NULL){
delete _udpcpChecksum;
_udpcpChecksum = NULL;}
}
UDPCPMessage(const UDPCPMessage& udpcpMessage);
UDPCPMessage& operator=(const UDPCPMessage& udpcpMessage);
};
UDPCPMessage::UDPCPMessage(const std::string& msg)
{
cout<<"parameter constructor called"<<endl;
_udpcpChecksum = new UDPCPChecksum();
}
UDPCPMessage::UDPCPMessage()
{
cout<<"default constructor called"<<endl;
_udpcpChecksum = new UDPCPChecksum();
}
UDPCPMessage::UDPCPMessage(const UDPCPMessage& udpcpMessage)
{
cout<< "copy constructor called"<<endl;
_udpcpChecksum = udpcpMessage._udpcpChecksum;
}
UDPCPMessage& UDPCPMessage::operator=(const UDPCPMessage& udpcpMessage)
{
cout<< "assignment called";
_udpcpChecksum = udpcpMessage._udpcpChecksum;
return *this;
}
class UDPCPConnectionInterface{
public:
void sendAck(UDPCPMessage udpcpmessage);
};
void UDPCPConnectionInterface::sendAck(UDPCPMessage UDPCPMessage)
{
cout<< "send Ack"<<endl;
}
int main()
{
UDPCPMessage udpcp = UDPCPMessage();
UDPCPConnectionInterface intf = UDPCPConnectionInterface();
cout<<"calling sendAck"<<endl;
intf.sendAck(udpcp);
return 0;
}
o/p:
default constructor called
calling sendAck
copy constructor called
send Ack
trying to delete
trying to delete
free(): double free detected in tcache 2
Is there any race condition happening while delete? what is the better way to handle such cases?