Pointers 为什么指针向量避免解构错误?

Pointers 为什么指针向量避免解构错误?,pointers,debugging,smart-pointers,stdvector,Pointers,Debugging,Smart Pointers,Stdvector,在我的一个项目中,我设法修复了一个从对象的std::vector切换到指向对象的指针的std::vector的错误。使用调试器,我发现在调用std::vector::clear时发生了错误,它应该销毁存储在vector中的对象。我很高兴我解决了这个问题,但我想知道为什么我能做到! 我在此附上被指控有罪的代码: #include <vector> #include <memory> #include <string> class Base { public:

在我的一个项目中,我设法修复了一个从对象的std::vector切换到指向对象的指针的std::vector的错误。使用调试器,我发现在调用std::vector::clear时发生了错误,它应该销毁存储在vector中的对象。我很高兴我解决了这个问题,但我想知道为什么我能做到! 我在此附上被指控有罪的代码:

#include <vector>
#include <memory>
#include <string>

class Base
{
 public:
 Base(int a);
 Base(const Base& o)=default;
 Base& operator=(const Base& o)=default;
 Base(Base&& o)=default;
 Base& operator=(Base&& o)=default;
 virtual ~Base()=default;
 virtual void Do();
};

class Derived: public Base
{
 private:
 std::string b;
 public:
 Derived(int a, std::string& 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::string& 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::string& 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%10==0)
    m.reset(); //The bug is here. If I use Main1 everything runs smoothly
}

return 0;
}
#包括
#包括
#包括
阶级基础
{
公众:
基础(INTA);
基准(常数基准&o)=默认值;
基本和运算符=(常量基本和o)=默认值;
基本(基本和非基本)=默认值;
基本运算符和运算符=(基本运算符和运算符)=默认值;
virtual~Base()=默认值;
虚空Do();
};
派生类:公共基
{
私人:
std::字符串b;
公众:
派生(inta,std::string&b):基(a),b(b){
};
//基重写Do的其他派生类
班长{
私人:
std::向量v;
公众:
Main();
voiddo(inti,std::string&b){
/*
如果发生什么事
v、 放回(a,b);//为了我们的目的,把_等价地推回
如果发生其他事情
v、 擦除(迭代器)
*/
}
无效重置(){
v、 清除();
}
};
Main1类{
私人:
std::向量v;
公众:
Main1();
voiddo(inti,std::string&b){
/*
如果发生什么事
v、 push_-back(std::unique_ptr(新派生的(i,b));
如果发生其他事情
v、 擦除(迭代器)
*/
}
无效重置(){
v、 清除();
}
};
int main()
{
主m;

对于(int i=0;上面的代码没有运行。如果你能提供一个完全可复制的样本,你可能会从社区得到更好的答案。我甚至不能从上面猜出一个好的答案。当你以不同的顺序推送内存时,可能你把内存放在了某个隐藏的地方?可能是别的什么?错误消息和堆栈跟踪也会有帮助p其他人也发现了这个问题。上面的代码没有运行。如果你能提供一个完全可复制的样本,你可能会从社区得到更好的答案。我甚至不能从上面猜出一个好的答案。也许你在以不同的顺序推送内存时,把内存放在了某个隐藏的地方?也许是别的什么?错误消息d堆栈跟踪也有助于其他人发现问题。