У меня есть два класса: spot
и frame
.Указатели не указывают на нужное место в векторе указателей на класс
spot
содержит данные о месте, обнаруженном каких-то процессор обработки изображений: оно имеет только id
(INT), который является уникальным, и x
, y
-координаты (оба дважды). Я сохраняю все пятна в векторе, который я вызываю spots
.
frame
имеет, среди прочего, вектор указателей на всех точках, которые принадлежат к нему:
class frame
{
int num ;
vector <spot *> spots_list ;
// other members and functions
}
Я читал данные из файла:
while (//goes through a lot of rows)
{
spot* S = new spot (ID, X, Y) ;
spots.push_back (*S) ;
frames[i].spot_list.push_back (&spots.back()) ;
delete S ;
}
так по существу, я создав новый экземпляр S
, а затем добавлю его данные в вектор spots
и добавьте указатель на его адрес в spot_list
фрейма. (по крайней мере, это то, что я хочу)
Когда я пытаюсь напечатать все точки в кадре, некоторые из них содержат данные об мусоре: например. id = 423784237, id = -9431101 - и остальные имеют действительные данные.
Но, когда я проверяю его прямо на вектор spots
, он не указывает на нужное место. Например, ID = 37 находится в ячейке 0x20f8288 в фрейме spot_list
, но в 0x210d080 в векторе spots
.
Поскольку есть случайные данные мусора, и адреса не совпадают, я уверен, что я не делаю этого правильно - но я не понимаю, что я должен делать по-другому. Буду признателен за любую помощь.
Пожалуйста, предоставьте [mcve]. – Barry
Почему вы сначала выделяете кучу, затем делаете копию и сохраняете ее, а затем удаляете оригинал? – stijn
Вы берете адрес элемента назад '& spot.back()', но этот адрес ** изменяется **, если вектор необходимо перераспределить, потому что вы добавили больше элементов. Как только вы назовете 'push_back', все указатели, которые вы указали на его элементы, являются * недействительными *. – Galik