ICU-5955 Add freeOffsetBuffer function to make sure that previously allocated offsetBuffer is freed to avoid memory leaks. Add deleter method in ssearch.cpp to remove hashtable objects. Delete various objects in intltest after it is no longer needed.
X-SVN-Rev: 24129
This commit is contained in:
parent
8d30278a2a
commit
c504eafdc8
@ -349,7 +349,7 @@ Collator* Collator::makeInstance(const Locale& desiredLocale,
|
|||||||
// non-table-based Collator in some other way, when it sees that it needs
|
// non-table-based Collator in some other way, when it sees that it needs
|
||||||
// to.
|
// to.
|
||||||
// The specific caution is this: RuleBasedCollator(Locale&) will ALWAYS
|
// The specific caution is this: RuleBasedCollator(Locale&) will ALWAYS
|
||||||
// return a valid collation object, if the system if functioning properly.
|
// return a valid collation object, if the system is functioning properly.
|
||||||
// The reason is that it will fall back, use the default locale, and even
|
// The reason is that it will fall back, use the default locale, and even
|
||||||
// use the built-in default collation rules. THEREFORE, createInstance()
|
// use the built-in default collation rules. THEREFORE, createInstance()
|
||||||
// should in general ONLY CALL RuleBasedCollator(Locale&) IF IT KNOWS IN
|
// should in general ONLY CALL RuleBasedCollator(Locale&) IF IT KNOWS IN
|
||||||
|
@ -5467,6 +5467,9 @@ cleanup:
|
|||||||
uprv_free(caseStart);
|
uprv_free(caseStart);
|
||||||
uprv_free(quadStart);
|
uprv_free(quadStart);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* To avoid memory leak, free the offset buffer if necessary. */
|
||||||
|
freeOffsetBuffer(&s);
|
||||||
|
|
||||||
if(normSource != normBuffer) {
|
if(normSource != normBuffer) {
|
||||||
uprv_free(normSource);
|
uprv_free(normSource);
|
||||||
@ -5848,7 +5851,10 @@ cleanup:
|
|||||||
uprv_free(terStart);
|
uprv_free(terStart);
|
||||||
uprv_free(secStart);
|
uprv_free(secStart);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* To avoid memory leak, free the offset buffer if necessary. */
|
||||||
|
freeOffsetBuffer(&s);
|
||||||
|
|
||||||
if(normSource != normBuffer) {
|
if(normSource != normBuffer) {
|
||||||
uprv_free(normSource);
|
uprv_free(normSource);
|
||||||
}
|
}
|
||||||
@ -6709,6 +6715,9 @@ saveState:
|
|||||||
unorm_closeIter(normIter);
|
unorm_closeIter(normIter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* To avoid memory leak, free the offset buffer if necessary. */
|
||||||
|
freeOffsetBuffer(&s);
|
||||||
|
|
||||||
// Return number of meaningful sortkey bytes.
|
// Return number of meaningful sortkey bytes.
|
||||||
UTRACE_DATA4(UTRACE_VERBOSE, "dest = %vb, state=%d %d",
|
UTRACE_DATA4(UTRACE_VERBOSE, "dest = %vb, state=%d %d",
|
||||||
dest,i, state[0], state[1]);
|
dest,i, state[0], state[1]);
|
||||||
@ -7111,6 +7120,9 @@ ucol_setVariableTop(UCollator *coll, const UChar *varTop, int32_t len, UErrorCod
|
|||||||
coll->variableTopValueisDefault = FALSE;
|
coll->variableTopValueisDefault = FALSE;
|
||||||
coll->variableTopValue = (CE & UCOL_PRIMARYMASK)>>16;
|
coll->variableTopValue = (CE & UCOL_PRIMARYMASK)>>16;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* To avoid memory leak, free the offset buffer if necessary. */
|
||||||
|
freeOffsetBuffer(&s);
|
||||||
|
|
||||||
return CE & UCOL_PRIMARYMASK;
|
return CE & UCOL_PRIMARYMASK;
|
||||||
}
|
}
|
||||||
|
@ -43,6 +43,7 @@
|
|||||||
|
|
||||||
#include "unicode/ucol.h"
|
#include "unicode/ucol.h"
|
||||||
#include "utrie.h"
|
#include "utrie.h"
|
||||||
|
#include "cmemory.h"
|
||||||
|
|
||||||
/* This is the internal header file which contains important declarations for
|
/* This is the internal header file which contains important declarations for
|
||||||
* the collation framework.
|
* the collation framework.
|
||||||
@ -1039,6 +1040,15 @@ static inline UBool ucol_unsafeCP(UChar c, const UCollator *coll) {
|
|||||||
}
|
}
|
||||||
#endif /* XP_CPLUSPLUS */
|
#endif /* XP_CPLUSPLUS */
|
||||||
|
|
||||||
|
/* The offsetBuffer in collIterate might need to be freed to avoid memory leaks. */
|
||||||
|
static inline void freeOffsetBuffer(collIterate *s) {
|
||||||
|
if (s != NULL && s->offsetBuffer != NULL) {
|
||||||
|
uprv_free(s->offsetBuffer);
|
||||||
|
s->offsetBuffer = NULL;
|
||||||
|
s->offsetBufferSize = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* #if !UCONFIG_NO_COLLATION */
|
#endif /* #if !UCONFIG_NO_COLLATION */
|
||||||
|
|
||||||
|
@ -319,10 +319,10 @@ ucol_openElements(const UCollator *coll,
|
|||||||
*status = U_MEMORY_ALLOCATION_ERROR;
|
*status = U_MEMORY_ALLOCATION_ERROR;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
result->reset_ = TRUE;
|
result->reset_ = TRUE;
|
||||||
result->isWritable = FALSE;
|
result->isWritable = FALSE;
|
||||||
result->pce = NULL;
|
result->pce = NULL;
|
||||||
|
|
||||||
if (text == NULL) {
|
if (text == NULL) {
|
||||||
textLength = 0;
|
textLength = 0;
|
||||||
@ -672,6 +672,9 @@ ucol_setText( UCollationElements *elems,
|
|||||||
}
|
}
|
||||||
|
|
||||||
elems->isWritable = FALSE;
|
elems->isWritable = FALSE;
|
||||||
|
|
||||||
|
/* free offset buffer to avoid memory leak before initializing. */
|
||||||
|
freeOffsetBuffer(&(elems->iteratordata_));
|
||||||
uprv_init_collIterate(elems->iteratordata_.coll, text, textLength,
|
uprv_init_collIterate(elems->iteratordata_.coll, text, textLength,
|
||||||
&elems->iteratordata_);
|
&elems->iteratordata_);
|
||||||
|
|
||||||
|
@ -3044,6 +3044,8 @@ U_CAPI void U_EXPORT2 usearch_setCollator( UStringSearch *strsrch,
|
|||||||
if (U_SUCCESS(*status)) {
|
if (U_SUCCESS(*status)) {
|
||||||
initialize(strsrch, status);
|
initialize(strsrch, status);
|
||||||
if (U_SUCCESS(*status)) {
|
if (U_SUCCESS(*status)) {
|
||||||
|
/* free offset buffer to avoid memory leak before initializing. */
|
||||||
|
freeOffsetBuffer(&(strsrch->textIter->iteratordata_));
|
||||||
uprv_init_collIterate(collator, strsrch->search->text,
|
uprv_init_collIterate(collator, strsrch->search->text,
|
||||||
strsrch->search->textLength,
|
strsrch->search->textLength,
|
||||||
&(strsrch->textIter->iteratordata_));
|
&(strsrch->textIter->iteratordata_));
|
||||||
@ -3426,6 +3428,8 @@ U_CAPI void U_EXPORT2 usearch_reset(UStringSearch *strsrch)
|
|||||||
if (!sameCollAttribute) {
|
if (!sameCollAttribute) {
|
||||||
initialize(strsrch, &status);
|
initialize(strsrch, &status);
|
||||||
}
|
}
|
||||||
|
/* free offset buffer to avoid memory leak before initializing. */
|
||||||
|
freeOffsetBuffer(&(strsrch->textIter->iteratordata_));
|
||||||
uprv_init_collIterate(strsrch->collator, strsrch->search->text,
|
uprv_init_collIterate(strsrch->collator, strsrch->search->text,
|
||||||
strsrch->search->textLength,
|
strsrch->search->textLength,
|
||||||
&(strsrch->textIter->iteratordata_));
|
&(strsrch->textIter->iteratordata_));
|
||||||
|
@ -641,7 +641,7 @@ void SSearchTest::offsetTest()
|
|||||||
backwardList.reverse();
|
backwardList.reverse();
|
||||||
|
|
||||||
if (forwardList.compare(backwardList)) {
|
if (forwardList.compare(backwardList)) {
|
||||||
logln("Works with \"%S\"", test[i].getTerminatedBuffer());
|
logln("Works with \"%s\"", test[i].getTerminatedBuffer());
|
||||||
logln("Forward offsets: [%s]", printOffsets(buffer, forwardList));
|
logln("Forward offsets: [%s]", printOffsets(buffer, forwardList));
|
||||||
// logln("Backward offsets: [%s]", printOffsets(buffer, backwardList));
|
// logln("Backward offsets: [%s]", printOffsets(buffer, backwardList));
|
||||||
|
|
||||||
@ -659,7 +659,9 @@ void SSearchTest::offsetTest()
|
|||||||
|
|
||||||
infoln();
|
infoln();
|
||||||
}
|
}
|
||||||
|
delete iter;
|
||||||
}
|
}
|
||||||
|
delete col;
|
||||||
}
|
}
|
||||||
|
|
||||||
class CEList
|
class CEList
|
||||||
@ -914,6 +916,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
static void deleteCEList(void *obj);
|
static void deleteCEList(void *obj);
|
||||||
|
static void deleteUnicodeStringKey(void *obj);
|
||||||
|
|
||||||
UHashtable *map;
|
UHashtable *map;
|
||||||
};
|
};
|
||||||
@ -928,6 +931,7 @@ StringToCEsMap::StringToCEsMap()
|
|||||||
&status);
|
&status);
|
||||||
|
|
||||||
uhash_setValueDeleter(map, deleteCEList);
|
uhash_setValueDeleter(map, deleteCEList);
|
||||||
|
uhash_setKeyDeleter(map, deleteUnicodeStringKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
StringToCEsMap::~StringToCEsMap()
|
StringToCEsMap::~StringToCEsMap()
|
||||||
@ -954,6 +958,13 @@ void StringToCEsMap::deleteCEList(void *obj)
|
|||||||
delete list;
|
delete list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StringToCEsMap::deleteUnicodeStringKey(void *obj)
|
||||||
|
{
|
||||||
|
UnicodeString *key = (UnicodeString *) obj;
|
||||||
|
|
||||||
|
delete key;
|
||||||
|
}
|
||||||
|
|
||||||
static void buildData(UCollator *coll, USet *charsToTest, StringToCEsMap *charsToCEList, CEToStringsMap *ceToCharsStartingWith)
|
static void buildData(UCollator *coll, USet *charsToTest, StringToCEsMap *charsToCEList, CEToStringsMap *ceToCharsStartingWith)
|
||||||
{
|
{
|
||||||
int32_t itemCount = uset_getItemCount(charsToTest);
|
int32_t itemCount = uset_getItemCount(charsToTest);
|
||||||
@ -1669,7 +1680,8 @@ void SSearchTest::monkeyTest(char *params)
|
|||||||
uset_close(contractions);
|
uset_close(contractions);
|
||||||
uset_close(expansions);
|
uset_close(expansions);
|
||||||
uset_close(charsToTest);
|
uset_close(charsToTest);
|
||||||
|
uset_close(letters);
|
||||||
|
|
||||||
ucol_close(coll);
|
ucol_close(coll);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2065,6 +2065,7 @@ TimeZoneRuleTest::TestT6216(void) {
|
|||||||
errln((UnicodeString)"FAIL: Invalid offset at time(" + times[j] + "):" + offset + " Expected:" + Expected[i][j]);
|
errln((UnicodeString)"FAIL: Invalid offset at time(" + times[j] + "):" + offset + " Expected:" + Expected[i][j]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
delete vtz;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user