Тазом чувствую, что что-то неправильно, а что -- понять не могу:
void __fastcall MergeDataSets(TOAClientDataSet* cdsDst, TOAClientDataSet* cdsSrc, std::vector<const char*>& KeyFieldNames, std::vector<const char*>& CopyFieldNames)
{
//собираю ключи, которые уже есть в датасете назначения
std::set<std::vector<AnsiString> > existing_keys;
for (cdsDst->First(); !cdsDst->Eof; cdsDst->Next())
existing_keys.insert(CreateKeyVector(cdsDst, KeyFieldNames)); //функцию смотри ниже
for (cdsSrc->First(); !cdsSrc->Eof; cdsSrc->Next())
{
//проверяю, что ключ из второго датасета не встречается в первом
std::vector
if (existing_keys.find(key) == existing_keys.end())
{
//копирую из второго в первый
//...
existing_keys.insert(key);
}
}
while (!existing_keys.empty())
{
//как бы, наверно, надо зачистить память, да?
existing_keys.begin()->clear();
existing_keys.erase(existing_keys.begin());
}
}
Ключ -- это вектор, строящийся из строчных представлений значений полей, имена которых перечислены в векторе KeyFieldNames, порядок, естественно, важен.
std::vector
{
unsigned key_length = KeyFieldNames.size();
std::vector<AnsiString> key;
for (unsigned i = 0; i < key_length; i++)
key.push_back(cds->FieldByName(KeyFieldNames[i])->AsString);
return key;
}
И вот подсказывает мне мой таз, что то ли память не зачищается где-то, то ли наоборот, объект удалится раньше, чем ссылки перестанут быть нужны.