0

我有这个简单的代码(为了缩短事情,重要的位可能只有构造函数和 add 方法。)(代码更新)。

#include "general.h"
template <class T>
class Template
{
private:
    T* oldArr;
    T* newArr;
    int oldArrTop;
    int oldArrLen;
public:
    Template();
    ~Template();
    void add(const T& val);
    void print();
};

template <class T>
Template<T>::Template()
{
    oldArr=new T[2];
    oldArrTop=0;
    oldArrLen=2;
    newArr=new T[4];
    //newArr's length is always 2.
}

template <class T>
Template<T>::~Template()
{
    delete[] oldArr;
    delete[] newArr;
}

template <class T>
void Template<T>::add(const T& val)
{
    //add normally
    oldArr[oldArrTop]=val;
    //need to copy 2 elements
    if( oldArrTop%2==1 )
    {
        newArr[oldArrTop]=oldArr[oldArrTop];
        newArr[oldArrTop-1]=oldArr[oldArrTop-1];
    }
    oldArrTop++;
    //need to double array's size
    if( oldArrTop==oldArrLen )
    {
        delete[] oldArr;
        oldArr=newArr;
        oldArrLen*=2;
        newArr=new T[oldArrLen*2];
    }
}

template <class T>
void Template<T>::print()
{
    for (int i=0; i<oldArrTop; i++)
        cout<<oldArr[i]<<endl;
}

这是使用模板的代码:

Template<int> a=Template<int>();
    for(int i=0;i<10;i++)
        a.add(i);
    a.print();

但是,当我将模板与整数一起使用时(例如),我第一次删除数组时(第一次进入 add 中的“需要加倍数组的大小”部分时,我得到一个堆损坏错误。任何人都知道问题是什么?非常感谢!


我不确定是什么修复了它,但堆损坏错误消失了。但是,它不是打印从 0 到 9 的数字,而是打印一个奇怪的数字 (-842105421)。任何想法为什么?

4

2 回答 2

3

我认为您可以在这里访问分配区域后面的内存:

oldArr[oldArrTop]=newArr[oldArrTop];

当您添加第二个值 oldArrTop 将变为 2 并且您将输入if( oldArrTop%2==0 ). 在此,如果您oldArr只有两个分配的元素但您尝试访问第三个(因为 oldArrTop==2 并且它意味着第三个元素):

oldArr[2]=newArr[2];
于 2012-06-14T19:42:56.687 回答
1

只需使用std::vector<T>. 它将为您管理内存(如果需要,数组大小将加倍:))

于 2012-06-14T19:37:07.660 回答