【发布时间】:2014-11-13 11:20:36
【问题描述】:
我有一个指向基类对象的指针向量,然后我将派生类的对象存储在其中。我添加指针的方式很明显
std::vector<Element*> mvGates;
...
mvGates.push_back(new Node(x, y));
当我的程序即将关闭时,这些指针在'for'循环中被释放
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 但它是导致堆错误的原因。
【问题讨论】:
-
也许你已经释放了内存?也许您更改了一个或多个指针?也许您认为一个对象属于一个子类,但它实际上属于另一个,并且您写入不属于该类的内存(并覆盖其他一些对象内存)?而你确实让你的析构函数
virtual?无论如何,问题不在于您在问题中显示的代码,而在于其他地方。 -
你的 Element 类是否实现了虚拟析构函数?
-
您的
Element的析构函数是否标记为virtual?查看错误消息,它似乎确实删除了小于实际对象大小(缺少 2c 个字节),这表明Element*已删除,但未调用Node*析构函数。这意味着,您的基类中没有虚拟析构函数。 -
向量
mvGates可能已损坏,或者析构函数中存在错误,或者您可能已经删除了节点,或者某些不相关的内存部分可能已损坏,或者其他原因可能已经发生了。这是不可能的。 -
您没有指定您的标准,但如果您可以使用 c++11,请考虑切换到智能指针en.cppreference.com/w/cpp/memory/shared_ptr 让对象为您记账,只需正确定义类即可。
标签: c++ pointers vector heap-memory