2017-01-18 4 views
2

Я пытаюсь добавить пустой объект в список, используя метод push_back.Ошибка сегментации, когда push_back в вектор C++

main.cpp

vector<FacialMemory> facial_memory; 

    printf("2\n"); 

    // Add people face memories based on number of sections 
    for (int i = 0; i < QuadrantDict::getMaxFaceAreas(); i++) 
    { 
      printf("i %d\n", i); 
      FacialMemory n_fm; 
      facial_memory.push_back(n_fm); // NOTE: Breaks here 
    } 

При вызове метода push_back, программа вылетает с ошибкой сегментации. Я просмотрел похожие вопросы, и они указывают на решение, которое у меня есть. Я также попытался передать FacialMemory() в вызов push_back, но все тот же вопрос.

FacialMemory класс определяется как таковую: FacialMemory.h

class FacialMemory 
{ 
private: 
     vector<FaceData> face_memory; 
public: 
     FacialMemory(); 
     ~FacialMemory(); 
     void pushData(FaceData face); 
     bool isEmpty(); 
     vector<FaceData> getFaces(); 
     FaceData getRecent(); 
}; 

Конструктор и деструктор

FacialMemory::FacialMemory() 
{ 
} 


FacialMemory::~FacialMemory() 
{ 
     delete[] & face_memory; 
} 
+0

Что находится в конструкторе класса FacialMemory? Также ваш код неэффективен, потому что вы копируете объекты повсюду. Рассмотрим использование семантики перемещения или объектов, выделенных кучей. – Dai

+0

Ничего страшного в опубликованном коде, но достаточно места для ошибки в неопубликованном коде. [mcve], пожалуйста. – user4581301

+0

Хорошо, я добавил конструктор и деструктор для FacialMemory – DSchana

ответ

5

Когда вы push_back вещь в vector, предмет скопирован. Иногда это вызывает больше работы по мере изменения размера vector: его текущее содержимое копируется, а теперь скопированные элементы, которые раньше принадлежали vector, были уничтожены. разрушение вызывает деструктор.

К сожалению, деструктор FacialMemory «s содержит фатальную ошибку:

FacialMemory::~FacialMemory() 
{ 
     delete[] & face_memory; <<== right here 
} 

Он пытается delete[] данные, которые не были выделены new[], и все, что управляет память программы закатила истерику из-за ожидаемого бухгалтерского учета структуры, которые отслеживают динамически распределенное хранилище (память, выделенная new или new[]) для возвращаемого хранилища, не были найдены или не верны.

Кроме того, face_memory является объектом std::vector, предназначенным для наблюдения за его памятью для вас. Вы можете создавать, копировать, изменять размер и удалять vector без каких-либо вмешательств в большинстве случаев. Наиболее заметным случаем счетчика является указатель vector указателей, в котором вам, возможно, придется вытащить данные с указанием при удалении указателя с vector.

Решение должно ничего не делать в деструкторе класса FacialMemory. Фактически, Rule of Zero рекомендует, чтобы у вас не было деструктора вообще, потому что у FacialMemory нет пользователей или ресурсов, требующих специальной обработки. Компилятор будет генерировать деструктор для вас с нулевой вероятностью ошибки.

При чтении ссылки на «Правило нуля» обратите внимание на Правила трех и пяти, поскольку они обрабатывают случаи, когда класс требует специальной обработки и описывают минимальную обработку, которую вы должны предоставить.

-2

Пожалуйста, обратитесь к vector-push-back

Попробуйте добавить содержательную конструктор копирования для класса FacialMemory

-1

Одна из причин возникновения ошибки Сегментация - это когда вы обращаетесь к части памяти, которая недействительна, и в вашей программе вы освобождаете память (удалите ключевое слово в своем деструкторе), которое не выделено новым ключевым словом.

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