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,但它导致堆错误.
你的std :: vector包含指向Element类实例的指针,但你正在使用Node类实例填充它.由于编译器没有抱怨我们可以安全地假设Node扩展了Element.
问题是,当您删除这些元素时,您将它们称为元素.除非你正确地覆盖了Element析构函数,否则delete操作将调用Element :: ~Element()而不是Node :: ~Node()
在类定义中,确保析构函数是虚拟的:
class Element{
virtual ~Element(){
//Element cleanup
}
//....
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1292 次 |
| 最近记录: |