2016-10-09 2 views
0

У меня есть два класса: 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.

Поскольку есть случайные данные мусора, и адреса не совпадают, я уверен, что я не делаю этого правильно - но я не понимаю, что я должен делать по-другому. Буду признателен за любую помощь.

+0

Пожалуйста, предоставьте [mcve]. – Barry

+0

Почему вы сначала выделяете кучу, затем делаете копию и сохраняете ее, а затем удаляете оригинал? – stijn

+0

Вы берете адрес элемента назад '& spot.back()', но этот адрес ** изменяется **, если вектор необходимо перераспределить, потому что вы добавили больше элементов. Как только вы назовете 'push_back', все указатели, которые вы указали на его элементы, являются * недействительными *. – Galik

ответ

0
spots.push_back(*S); 

Этот вызов иногда необходимо перераспределить хранения внутри spots; когда это происходит, любые ранее сохраненные адреса становятся недействительными, поэтому записи в spots_list становятся фиктивными.

Если вы знаете, насколько велик вектор, вы можете предварительно выделить внутренние элементы spots с помощью spots.reserve(size); в противном случае вы можете хранить индексы в векторе вместо указателей.

 Смежные вопросы

  • Нет связанных вопросов^_^