#pointers #debugging #smart-pointers #stdvector
#указатели #отладка #интеллектуальные указатели #stdvector
Вопрос:
В одном из моих проектов мне удалось исправить ошибку переключения с std::vector объектов на std::vector указателей на объект. Используя отладчик, я обнаружил, что ошибка возникла, когда я вызывал std::vector<T,Allocator>::clear, который должен уничтожать объекты, хранящиеся в векторе. Я рад, что решил проблему, но я хотел бы знать, почему я смог! Здесь я прилагаю инкриминируемый код:
#include <vector>
#include <memory>
#include <string>
class Base
{
public:
Base(int a);
Base(const Baseamp; o)=defau<
Baseamp; operator=(const Baseamp; o)=defau<
Base(Baseamp;amp; o)=defau<
Baseamp; operator=(Baseamp;amp; o)=defau<
virtual ~Base()=defau<
virtual void Do();
};
class Derived: public Base
{
private:
std::string b;
public:
Derived(int a, std::stringamp; b) : Base(a), b(b) {}
};
//Other derived classes from Base overriding Do
class Main{
private:
std::vector<Derived> v;
public:
Main();
void Do(int i, std::stringamp; b){
/*
if something happens
v.emplace_back(a, b);// push_back equivalently for our purpose
if something else happens
v.erase(iterator)
*/
}
void reset(){
v.clear();
}
};
class Main1{
private:
std::vector<std::unique_ptr<Derived>> v;
public:
Main1();
void Do(int i, std::stringamp; b){
/*
if something happens
v.push_back(std::unique_ptr<Derived>(new Derived(i, b)));
if something else happens
v.erase(iterator)
*/
}
void reset(){
v.clear();
}
};
int main()
{
Main m;
for(int i=0; i<101; i){
//something
m.Do(i, b);
//something
if(i==0)
m.reset(); //The bug is here. If I use Main1 everything runs smoothly
}
return 0;
}
Это упрощенная версия кода, которая создает мне проблему. Я надеюсь, что деталей достаточно, чтобы дать правильный ответ на вопрос.
Отладчик указывает мне глубоко в коде, определяющем, что делает деконструктор, сообщающий о ошибке сегментации, и лично я не могу понять, что делает этот код.
Компилятор, который я использую, — это g 10.1 с флагом std = c 17.
Комментарии:
1. Приведенный выше код не выполняется. Если вы можете предоставить полностью воспроизводимый образец, вы можете получить лучшие ответы от сообщества. Я даже не могу сделать хорошее предположение из чуть выше. Может быть, вы взорвали память где-то, что скрыто, когда вы перемещаете память в другом порядке? Может быть, что-то еще? Сообщение об ошибке и трассировка стека также помогут другим обнаружить проблему.