fixed memory leaks in Preparation and Binder

This commit is contained in:
Aleksandar Fabijanic 2008-11-13 02:18:29 +00:00
parent 437dafa45c
commit 9d9db7ce90
3 changed files with 28 additions and 47 deletions

View File

@ -611,8 +611,8 @@ private:
template <typename T>
void deleteCachedArray(std::size_t pos) const
{
T* p = Poco::AnyCast<T>(&_values[pos]);
delete [] p;
T** p = Poco::AnyCast<T*>(&_values[pos]);
if (p) delete [] *p;
}
const StatementHandle& _rStmt;

View File

@ -63,21 +63,7 @@ Binder::Binder(const StatementHandle& rStmt,
Binder::~Binder()
{
LengthVec::iterator itLen = _lengthIndicator.begin();
LengthVec::iterator itLenEnd = _lengthIndicator.end();
for(; itLen != itLenEnd; ++itLen) delete *itLen;
TimestampMap::iterator itTS = _timestamps.begin();
TimestampMap::iterator itTSEnd = _timestamps.end();
for(; itTS != itTSEnd; ++itTS) delete itTS->first;
StringMap::iterator itStr = _strings.begin();
StringMap::iterator itStrEnd = _strings.end();
for(; itStr != itStrEnd; ++itStr) std::free(itStr->first);
CharPtrVec::iterator itChr = _charPtrs.begin();
CharPtrVec::iterator endChr = _charPtrs.end();
for (; itChr != endChr; ++itChr) delete [] *itChr;
freeMemory();
}

View File

@ -36,6 +36,10 @@
#include "Poco/Data/ODBC/Preparation.h"
#include "Poco/Data/ODBC/ODBCMetaColumn.h"
#include "Poco/Exception.h"
using Poco::InvalidArgumentException;
namespace Poco {
@ -76,43 +80,34 @@ void Preparation::freeMemory() const
{
IndexMap::iterator it = _varLengthArrays.begin();
IndexMap::iterator end = _varLengthArrays.end();
for (; it != end; ++it)
for (; it != end; ++it)
{
switch (it->second)
{
case DT_BOOL:
deleteCachedArray<bool>(it->first);
break;
case DT_CHAR:
deleteCachedArray<char>(it->first);
break;
case DT_BOOL:
deleteCachedArray<bool>(it->first);
break;
case DT_CHAR_ARRAY:
{
char* pc = AnyCast<char>(&_values[it->first]);
std::free(pc);
break;
}
case DT_CHAR:
deleteCachedArray<char>(it->first);
break;
case DT_BOOL_ARRAY:
{
bool* pb = AnyCast<bool>(&_values[it->first]);
std::free(pb);
break;
}
case DT_CHAR_ARRAY:
{
char** pc = AnyCast<char*>(&_values[it->first]);
if (pc) std::free(*pc);
break;
}
case DT_DATE:
deleteCachedArray<SQL_DATE_STRUCT>(it->first);
break;
case DT_BOOL_ARRAY:
{
bool** pb = AnyCast<bool*>(&_values[it->first]);
if (pb) std::free(*pb);
break;
}
case DT_TIME:
deleteCachedArray<SQL_TIME_STRUCT>(it->first);
break;
case DT_DATETIME:
deleteCachedArray<SQL_TIMESTAMP_STRUCT>(it->first);
break;
default:
throw InvalidArgumentException("Unknown data type.");
}
}
}