Почему std ::вектор указателей избегает ошибок деконструкции?

#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. Приведенный выше код не выполняется. Если вы можете предоставить полностью воспроизводимый образец, вы можете получить лучшие ответы от сообщества. Я даже не могу сделать хорошее предположение из чуть выше. Может быть, вы взорвали память где-то, что скрыто, когда вы перемещаете память в другом порядке? Может быть, что-то еще? Сообщение об ошибке и трассировка стека также помогут другим обнаружить проблему.