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

时间:2014-11-13 11:20:37

标签: c++ pointers vector heap

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

std::vector<Element*> mvGates;
...
mvGates.push_back(new Node(x, y));

当我的节目即将被关闭时,这些指针将被释放出来,因为&#39;环

 for (int i=0; i<mvGates.size(); ++i)
 {
     delete mvGates[i];
 }

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

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

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

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

我一直在使用它作为2元素阵列。我不知道为什么它没有导致SIGSEGV,但这是导致堆错误的原因。

3 个答案:

答案 0 :(得分:8)

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

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

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

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

   //....
};

答案 1 :(得分:0)

在您的代码中,您正在使用索引访问向量中的每个对象,并且您正在删除它们。然而,除了&#34; Pierluigi&#34;说(虚拟〜问题),您是不是应该访问每个对象并使用迭代器而不是直接使用索引来删除它们?

答案 2 :(得分:-3)

你在增量部分中犯了错误。它的i ++你不需要++ i。

如果使用++ i,它将在循环到for循环之前递增,因此在迭代器编号中它指的是实际上不存在的mvGates [i]。只有矢量范围从0到长度-1。

for (int i=0; i<mvGates.size(); i++)
{
    delete mvGates[i];
}