2014-11-18 2 views
2

EDIT: Кажется, что это проблема с использованием memset на моей структуре, вместо этого очистка вектора. Спасибо всем, кто предоставил советы!C++: проблема с очисткой вектора объектов


Я пытаюсь очистить свой вектор объектов объекта (мой собственный определенный класс), называемый людьми. Вектор сидит в структуры (PQA) и определяется следующим образом:

typedef struct _FSTRUCT_ 
{ 
    const char * filePath; 
    std::vector<Subject> people; 
    long srcImageWidth; 
    long srcImageHeight; 
    STRUCT_CONFIG_PARAMS * configParam; 
    unsigned char * imageBuf; 
    int imageBufLen; 
} STRUCT_FSTRUCT; 

я создаю-структуру PQA по:

STRUCT_FSTRUCT *pQA = NULL; 
pQA = new STRUCT_FSTRUCT(); 
memset(pQA,0,sizeof(STRUCT_FSTRUCT)); 

Я заселить «народ» с данными с помощью класса Subject 'заданные методы. Все в порядке. То, что я хотел сделать, это то сбросить «народ», т.е. очистить все данные и установите размер 0. Я называю метод ниже:

int ResetFaceCollection() 
{ 
    if (!pQA->people.empty()) 
    { 
     pQA->people.clear(); 
    } 
} 

clear() линия кидает отладки утверждение не выполнено сообщение об ошибке, которое гласит «Выражение: векторные итераторы несовместимы».

Я не уверен, если это не имеет ничего общего с деструктора Субъекта:

Subject::~Subject(void) 
{ 
} 

Я не использую никаких указателей, поэтому от того, что я собрал, деструктор выглядит нормально. Я, конечно, определил деструктор в моем .h файле также ~Subject(void);.

Я немного потерял, почему это происходит. Может ли кто-нибудь дать представление?

Приносим извинения, если я пропущен какой-либо необходимый код, может быть обновлен по запросу!

+2

'_MYSTRUCT_' является зарезервированным идентификатором –

+1

, зачем использовать структуру с именем weirdly с только вектором внутри? Просто используйте вектор напрямую. Также ничего, что кажется неправильным в коде, который вы показали, вы можете захотеть опубликовать немного больше. ** Редактирование: ** Ох и проверка, является ли он пустым, является излишним, '.clear()' noop anyways, если он пуст, поэтому просто вызывайте его без этого if. –

+0

Я пропустил остальные переменные, добавлю теперь. :/ – LKB

ответ

3

Ваш std::memset вызов (а) излишним, так как

pQA = new STRUCT_SPID_QA(); // <---- note the parens 

значение инициализирует объект, который инициализирует целые до 0 и указатели на nullptr здесь.

и (б) на самом деле очень неправильно:

Если объект не является тривиальным-копируемыми (например, скаляр, массив или С-совместимая структура), поведение не определено.

Source

Вашего _SPID_FQA_ содержит не тривиальную Copyable объекта типа std::vector<Subject>, что делает _SPID_FQA_ не тривиальный копируемым.

1

Примечание: firtly ФОС не показал, что он использует MemSet некоторые, где в его коде, который у я дал этот ответ, как я думал, что это weired поведение из-за какой-то проблемы в clear как упоминалось в связи ниже.

1) cppreference.com: говорит, что он делает недействительными любые ссылки, указатели или итераторы, ссылающиеся на содержащиеся элементы. Может привести к аннулированию любых итераторов в прошлом. Листья capacity() вектор без изменений.

2) cplusplus.com говорит, что: Не может произойти перераспределение, и пропускная способность вектора не может быть изменена из-за вызова этой функции. Типичный вариант, который заставляет перераспределить является использование swap:

vector<T>().swap(x); // clear x reallocating

, но вы можете использовать это также:

int ResetFaceCollection() 
{ 
    if (!pQA->people.empty()) 
    { 
     pQA->people.erase(pQA->people.begin(),pQA->people.end()); 
    } 
} 

И проверить, если он дает какую-либо ошибку?

здесь является, вероятно, та же среда и работает отлично с г ++, лязг, VC++ link

+0

Спасибо rupesh за ваш ответ.Вызов 'erase()' имеет тот же результат, что и 'clear()' - утверждение отладки. 'Swap()' на самом деле работает, но кажется немного .. хаки? – LKB

+0

yaa это, но 'erase' и' clear' должны работать? –

+0

'clear()' делает то же, что и 'erase()'. Вызов этих методов дает мне ошибку. – LKB