У меня есть вектор, объявленный как:
vector<Curve> workingSet;
Curve - это созданный мной класс, который содержит строку «name» и массив структур, динамически выделяемых конструктором.
У меня есть цикл, который должен удалить 2 (из 4) элементов из вектора.
vector<Curve>::iterator it = workingSet.begin();
//remove tbi's children from the working set
for ( ; it != workingSet.end();){
if (it->thisName == tbi.childAName ||it->thisName == tbi.childBName)
it= workingSet.erase(it);
else
++it;
}
Когда отладчик достигает вызова .erase (it), я вижу, что итератор it указывает на кривую 2 в векторе. Это хорошо; Я хочу, чтобы кривая 2 была удалена из вектора.
Затем отладчик переводит меня в деструктор (у меня там есть точка останова), который предположительно должен разрушать кривую 2. Но когда я смотрю на часы «это», я вижу, что разрушаемая кривая - это кривая 4! Затем деструктор переходит к 'delete []' массиву в объекте, как требуется, и устанавливает указатель массива в NULL.
Когда отладчик возвращается к программе, выполнив вызов erase (), я вижу, что вектор 2 был удален из массива, а кривая 4 все еще там. Указатель на массив кривой 4 по-прежнему указывает на то же место, что и раньше, но память освобождена и массив содержит мусор.
Кто-нибудь может подсказать, почему кривую 4 путают?
N.b. (1) Существует конструктор копирования для класса кривой, который выполняет «глубокую» копию. N.b. (2) Класс / программа - это нечто большее, чем я упомянул здесь.
Кстати, указатели на массивы на кривых 2 и 4 указывают на разные места и содержат разные значения, в зависимости от отладчика.
Изменить: теперь я реализовал назначение копии. Теперь кажется, что правильный элемент стирается из вектора, но неправильный деструктор все еще вызывается! Однако, когда отладчик возвращается к массиву, кривая 4 остается нетронутой.