2

所以我有以下类方法(如果需要,可能会添加更多):

编辑 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++ 中)ArrayClassclass 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;
    }

发生错误时,c6的值为 _currSize(类私有 int 变量)的值为1. 值得注意的是,paObject 是一个 Object 类型的类指针(它是一个模板......等等),在错误发生时使用大小为 1 的 Objects 数组进行了初始化(Object* paObject = new Object[1])。

一切都执行得很好,直到它到达该行时delete[] paObject;它给了我一个Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)错误。

我真的不明白出了什么问题。帮助将不胜感激。

4

2 回答 2

1

当您遇到堆问题时会发生此错误。
就像是:

int *a = new char[1];
a[500] = 0;

然后,在完全不相关的对象上,您将在deleteor上得到一个错误new

于 2012-09-28T19:46:14.590 回答
0

您还没有向我们展示 paObject 在哪里声明...或它在哪里(重新)初始化...

...但这几乎肯定是问题所在。

如果您尚未将其初始化为 NULL,则它可能包含随机垃圾。在这种情况下,它不会评估为 NULL,并且会发生坏事。

同样,如果不明确将其重置为 NULL,那么也会发生坏事。

当然,我们甚至不知道 paObject 是否是一个数组(使用“new []”分配)……因为您没有向我们展示。

底线:

1)确保paObject在使用前已初始化,并在重新使用前正确初始化。

2)如果将其视为数组对象,请确保将其初始化为数组对象

3) 您还需要注意“对象”、“对象引用”(&Object 或 Object *)、对象数组之间的差异。特别是,您需要考虑何时传递对现有对象的引用,或者何时(可能无意地)创建新对象。

这些链接应该会有所帮助:

==================================================== =================

附录:

听起来错误Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)正在发生,因为您正在覆盖您的数组。

Object* paObject = new Object[1]  // This is really easy to overwrite!

我看不到在代码中写入 paObject 的位置(或写入 paObject 的某个别名),但我几乎可以肯定这就是问题所在。

恕我直言...

于 2012-09-28T19:52:55.363 回答