Hi,

I have a dll and i think that has a memory leak.
The programs enter to this function everytime that i need to call the database.

Code:
 // Create the thread-local DB Interface object if not done
    DBInterface *dbI = (DBInterface*) TlsGetValue(_tlsDBInterface);
    if (!dbI) {
		#ifdef DEBUG
			REPORT_INFO(EVMSG_TLSINIT,0,NULL);
		#endif
	  dbI = new DBInterface(*g_settings);
	  TlsSetValue(_tlsDBInterface,dbI);
	}      
		ADODB::_RecordsetPtr recSet;
		int returnCode;
		
			recSet = dbI->NA_RD_AccesoRequest(pInAttrs,&returnCode);
This is the constructor and destructos of the class DBInterface.

Code:
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

DBInterface::DBInterface(SettingsManager &smgr) :
m_settings(smgr), m_valid(false)/*, m_LRAttributeArray(NULL)*/,m_NA_RD_LRAttributeArray(NULL),
m_ACAttributeArray(NULL), /*m_GPAttributeArray(NULL),*/m_ACUPAttributeArray(NULL),m_RechPCAttributeArray(NULL),m_RechCCAttributeArray(NULL),
m_passwordOutputIndex(-1L)
{
}

DBInterface::~DBInterface()
{
	//if (m_LRAttributeArray) delete[] m_LRAttributeArray;
	//if (m_GPAttributeArray) delete[] m_GPAttributeArray;
	if (m_ACAttributeArray) delete[] m_ACAttributeArray;
	if (m_ACUPAttributeArray) delete[] m_ACUPAttributeArray;
	if (m_RechPCAttributeArray) delete[] m_RechPCAttributeArray;
	if (m_RechCCAttributeArray) delete[] m_RechCCAttributeArray;
	if (m_NA_RD_LRAttributeArray) delete[] m_NA_RD_LRAttributeArray;
}
this is the header file of the DBInterface.h

Code:
// DBInterface.h: interface for the DBInterface class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_DBINTERFACE_H__4B3AE378_BB57_4521_9AF3_F26A98A681BB__INCLUDED_)
#define AFX_DBINTERFACE_H__4B3AE378_BB57_4521_9AF3_F26A98A681BB__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class DBInterface  
{
public:
  DBInterface(SettingsManager &sm);
  virtual ~DBInterface();

  // Run a login request
 // ADODB::_RecordsetPtr LoginRequest(CONST RADIUS_ATTRIBUTE *pInAttrs, BSTR *pwd = NULL);
  // Run a acceso request
  ADODB::_RecordsetPtr AccesoRequest(CONST RADIUS_ATTRIBUTE *pInAttrs, int *returnCode = NULL);
   // Run a acceso request IN TEL DATA NA_RD_
  ADODB::_RecordsetPtr NA_RD_AccesoRequest(CONST RADIUS_ATTRIBUTE *pInAttrs, int *returnCode = NULL);

  // Run Recharge PC
  ADODB::_RecordsetPtr RechargePCAuth(CONST RADIUS_ATTRIBUTE *pInAttrs, int *returnCode = NULL);

  // Run Agrega cuentas pc
  ADODB::_RecordsetPtr AccountsPCAuth(CONST RADIUS_ATTRIBUTE *pInAttrs, int *returnCode = NULL);
 
  // Run Check Balance pc
  ADODB::_RecordsetPtr CheckBalancePC(CONST RADIUS_ATTRIBUTE *pInAttrs, int *returnCode = NULL);

   // Run Recharge Cards
  ADODB::_RecordsetPtr RechargeCards(CONST RADIUS_ATTRIBUTE *pInAttrs, int *returnCode = NULL);

  // Run Add Numbers pc
  ADODB::_RecordsetPtr AddNumbersPC(CONST RADIUS_ATTRIBUTE *pInAttrs, int *returnCode = NULL);

  // Run Recharge CC
  ADODB::_RecordsetPtr RechargeCCAuth(CONST RADIUS_ATTRIBUTE *pInAttrs, int *returnCode = NULL);

  // Run a password fetch request
 // BSTR GetPassword(CONST RADIUS_ATTRIBUTE *pInAttrs);
  // Handle an accounting stop packet
  void AccountingRequest(CONST RADIUS_ATTRIBUTE *pInAttrs);

  // Handle an accounting Update packet
  void AccountingUpdate(CONST RADIUS_ATTRIBUTE *pInAttrs);

  BOOL isValid();
protected:
  BOOL m_valid;
  
  ADODB::_CommandPtr m_CheckBalancePCCommand;
  _bstr_t            m_CheckBalancePCConn;
  ADODB::_CommandPtr m_accesoRequestCommand;
  _bstr_t            m_accesoRequestConn;
  ADODB::_CommandPtr m_NA_RD_accesoRequestCommand;
  _bstr_t            m_NA_RD_accesoRequestConn;
  ADODB::_CommandPtr m_RechargePCAuthCommand;
  _bstr_t            m_RechargePCAuthConn;
  ADODB::_CommandPtr m_AddNumbersPCAuthCommand;
  _bstr_t            m_AddNumbersPCAuthConn;
  ADODB::_CommandPtr m_AccountsPCAuthCommand;
  _bstr_t            m_AccountsPCAuthConn;
   ADODB::_CommandPtr m_RechargeCCAuthCommand;
  _bstr_t            m_RechargeCCAuthConn;
 /* ADODB::_CommandPtr m_loginRequestCommand;
  _bstr_t            m_loginRequestConn;*/
  ADODB::_CommandPtr m_accountingCommand;
  _bstr_t            m_accountingConn;
  ADODB::_CommandPtr m_AccountingUpdateCommand;
  _bstr_t            m_AccountingUpdateConn;
  //ADODB::_CommandPtr m_getPasswordCommand;
  //_bstr_t            m_getPasswordConn;
  ADODB::_CommandPtr m_RechargeCardsCommand;
  _bstr_t            m_RechargeCardsConn;

  _variant_t         m_passwordOutputIndex;
  _variant_t         m_loginPasswordOutputIndex;
  
 // SettingsManager::CommandParameter   *m_GPAttributeArray;
 // SettingsManager::CommandParameter   *m_LRAttributeArray;
  SettingsManager::CommandParameter   *m_NA_RD_LRAttributeArray; //ARRAY PARA EL ACCESSO REQUEST DE TEL_DATA
  SettingsManager::CommandParameter   *m_ACAttributeArray;
  SettingsManager::CommandParameter   *m_ACUPAttributeArray;
  SettingsManager::CommandParameter   *m_RechPCAttributeArray; //RECHARGE PC
  SettingsManager::CommandParameter   *m_RechCCAttributeArray; //CREDIT CARDS
  SettingsManager::CommandParameter   *m_AccountsPCAttributeArray; //Accounts PC
  SettingsManager::CommandParameter   *m_CheckBalancePCAttributeArray; //Balance of  PC
  SettingsManager::CommandParameter   *m_AddNumbersPCAttributeArray; //Add numbers from  PC
  SettingsManager::CommandParameter   *m_RechargeCardsArray; //Add Recharge Cards
   
  SettingsManager &m_settings;

  // Execute an ADO command and return the recordset
  ADODB::_RecordsetPtr CallCommand(ADODB::_CommandPtr cp, 
																	 _bstr_t &connStr,
																	 SettingsManager::CommandParameter *attrArray,
																	 CONST RADIUS_ATTRIBUTE *pAttrs);
};

#endif //
Do i need to delete all the SettingsManager::CommandParameter *Pointers that i have on the DBInterface Header, on the Destruction of the DBInterface ???

Could that be the memory leak ?

Thank you