C++从向量中删除指针会导致堆错误

Ram*_*mes 1 c++ heap pointers vector

我有一个指向我的基类对象的指针向量,然后我将派生类中的对象存储在其中.我添加指针的方式非常明显

std::vector<Element*> mvGates;
...
mvGates.push_back(new Node(x, y));
Run Code Online (Sandbox Code Playgroud)

当我的程序即将被关闭时,这些指针在'for'循环中被释放

 for (int i=0; i<mvGates.size(); ++i)
 {
     delete mvGates[i];
 }
Run Code Online (Sandbox Code Playgroud)

在这一行我的调试器(我正在使用Qt Creator)显示如下几行:

Heap block at 14E50F50 modified at 14E50F84 past requested size of 2c
Invalid address specified to RtlFreeHeap( 00030000, 14E50F58 )
Run Code Online (Sandbox Code Playgroud)

可能是什么原因,我做错了什么?我知道我没有向你展示完整的代码,因为它很长,但也许它足以告诉我我的错误.可能你会建议我使用智能指针.我想我会这样做,但这不能回答我的问题 - 这段代码可能有什么问题.

编辑:这是一个非常简单的错误,你不能在这里注意到它.在我已声明的Node类中some_type array[0];

我一直在使用它作为2元素数组.我不知道为什么它不会导致SIGSEGV,但它导致堆错误.

Pie*_*igi 8

你的std :: vector包含指向Element类实例的指针,但你正在使用Node类实例填充它.由于编译器没有抱怨我们可以安全地假设Node扩展了Element.

问题是,当您删除这些元素时,您将它们称为元素.除非你正确地覆盖了Element析构函数,否则delete操作将调用Element :: ~Element()而不是Node :: ~Node()

在类定义中,确保析构函数是虚拟的:

class Element{
   virtual ~Element(){
      //Element cleanup
   }

   //....
};
Run Code Online (Sandbox Code Playgroud)