mirror of
https://github.com/pocoproject/poco.git
synced 2025-03-30 23:51:34 +02:00
fixed memory leaks in Preparation and Binder
This commit is contained in:
parent
437dafa45c
commit
9d9db7ce90
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
@ -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.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user