Так что у меня есть следующий метод класса (вероятно, добавит больше, если требуется):
РЕДАКТИРОВАТЬ 1:
Вот где инициализируется paObject и как он остается, пока не достигнет setCapacity(int c)
template <Object>
ArrayClass<Object>::ArrayClass()
{
_size = 0; //default in case allocation fails
paObject = new Object[ARRAY_CLASS_DEFAULT_SIZE];
if (paObject == NULL)
throw Exception();
_size = ARRAY_CLASS_DEFAULT_SIZE;
}
Может быть важно отметить, что мой класс Vector расширяется (или что-то еще в c ++) ArrayClass
: class MyVector: virtual public ArrayClass<Object>{}
а потом в
template <class Object>
MyVector<Object>::MyVector() : ArrayClass<Object>()
{
_currSize = 0;
_incFactor = 5;
}
это заставляет вызывать конструктор ArrayClass.
template <Object >
void MyVector<Object>::setCapacity(int c)
{
int len = _currSize;
if (len > c) len = c;
Object* paNew = new Object[c];
if (paNew == NULL) throw Exception();
for (int i = 0; i < len; i++)
paNew[i] = paObject[i];
if (paObject != NULL)
delete[] paObject;
paObject = paNew;
_size = c;
if (_currSize > len)
_currSize = len;
}
Когда происходит ошибка, значение c 6
и значение _currSize (частная переменная класса int) 1
, Также замечательно отметить, что paObject — это указатель класса типа Object (который является шаблоном … и т. Д. И т. Д.), Инициализированный массивом объектов размера 1 к моменту возникновения ошибки (Object* paObject = new Object[1]
).
Все выполняется хорошо, пока не достигнет линии delete[] paObject;
в этот момент это дает мне Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
ошибка.
Я серьезно не понимаю, что не так.
Помощь будет оценена.
Эта ошибка возникает, когда у вас есть проблема с кучей.
Что-то вроде:
int *a = new char[1];
a[500] = 0;
затем на совершенно не связанном объекте вы получите ошибку delete
или же new
,
Вы не показали нам, где объявлен paObject … или где он (ре) инициализирован …
… но это почти наверняка проблема.
Если вы не инициализировали его в NULL, он может содержать случайный мусор. В этом случае он не будет оцениваться как NULL, и произойдут плохие вещи.
Точно так же, если явно не сбросить его в NULL, то произойдут и плохие вещи.
Конечно, мы даже не знаем, является ли paObject массивом (выделенным с помощью «new []») … потому что вы не показали нам.
НИЖНЯЯ ЛИНИЯ:
1) Убедитесь, что paObject инициализирован перед использованием, и правильно инициализирован перед повторным использованием.
2) Если вы рассматриваете его как объект массива, убедитесь, что он инициализирован как объект массива
3) Также нужно быть осторожным в различиях между «Объектом», «Ссылкой на объект» (&Объект или Объект *), массивы Объектов. В частности, вам необходимо учитывать, когда вы передаете ссылку на существующий объект или когда вы (возможно, непреднамеренно) создаете новый объект.
Эти ссылки должны помочь:
================================================== ================
ДОПОЛНЕНИЕ:
Звучит как ошибка Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
происходит, потому что вы перезаписываете свой массив.
Object* paObject = new Object[1] // This is really easy to overwrite!
Я не вижу где в коде, который вы пишете в paObject (или пишете в какой-то псевдоним paObject), но я почти уверен, что это проблема.
ПО МОЕМУ МНЕНИЮ…