【发布时间】:2013-12-02 21:04:40
【问题描述】:
我最近遇到了一些我用 C++ 编写的代码的问题,我无法找到解决方案。乍一看,这个问题似乎很简单,但由于某种原因,程序抛出了一个错误,我无法解释原因。 我不会复制粘贴我遇到错误的原始代码(因为它太麻烦了),但这是它的简化版本,它表现出完全相同的行为和相同的上下文:
#include<vector>
using namespace std;
class A_class
{
bool *heap_space; //can be any type of pointer
public:
A_class() { heap_space = new bool[4]; }
A_class(const A_class&) { heap_space = new bool[4]; }
~A_class() { delete[] heap_space; }
};
void main()
{
vector<A_class> ObjArr(5);
vector<A_class>::iterator iTer = ObjArr.begin() + x;
//where x can be any number from 0 to 3
ObjArr.erase(iTer);
}
我知道代码看起来非常简单,但我似乎无法弄清楚引发异常的原因。代码将抛出“调试断言失败!”每次我尝试运行它时,运行时都会显示“表达式:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)”的消息。
在容器的擦除方法期间消息不会立即出现也可能很有用。它仅在向量超出范围后出现。 因此,我一直尝试通过各种方法修复错误,方法是在向量超出范围之前添加代码(例如在擦除后立即重新插入新元素),但没有成功。此外,经过一些实验后,我发现该消息仅在擦除除向量的最后一个元素(ObjArr.end()-1)之外的任何内容后才会出现。如果向量的最后一个元素是被删除的元素,显然没有什么不好的事情发生。希望这些提示有所帮助。 如果有人知道为什么会发生这种情况,请向我解释。我确定我只是犯了一个菜鸟错误,因为这似乎很容易弄清楚,但我却做不到。
以上代码是在 Windows 7 下使用 Visual Studio 2013 编译的。
【问题讨论】:
-
仅供参考,这段代码在我的电脑(x64 linux)和ideone(ideone.com/8MPbHG)上运行良好
-
需要提供赋值运算符。
标签: c++ object vector delete-operator erase