Я недавно столкнулся с проблемой с некоторым кодом, который я написал на 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). Если последний элемент вектора является стираемым, то, по-видимому, ничего плохого не происходит. Надеюсь, эти подсказки помогли. Если кто-нибудь знает, почему это происходит, объясните мне это. Я уверен, что я просто делаю ошибку новобранец, так как это кажется таким легким для понимания, но я не могу.
Код выше был составлен с использованием Visual Studio 2013 под Windows 7.
Для справки, этот код отлично работает на моем компьютере (x64 linux) и на ideone (http://ideone.com/8MPbHG) – Xymostech
Вам необходимо предоставить оператор присваивания. – juanchopanza