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();

ただし、整数でテンプレートを使用した場合(たとえば)、初めて配列を削除したとき(最初に追加で「配列のサイズを2倍にする必要がある」部分に入ったとき、ヒープ破損エラーが発生しました。誰でも知っています問題は? どうもありがとうございました!


何が修正されたのかわかりませんが、ヒープ破損エラーはなくなりました。ただし、0 から 9 までの数字を表示する代わりに、変な数字 (-842105421) を表示するだけです。理由はありますか?

4

2 に答える 2

3

ここで、割り当てられた領域の背後にあるメモリにアクセスできると思います:

oldArr[oldArrTop]=newArr[oldArrTop];

2 番目の値を追加すると、oldArrTop が 2 になり、 と入力しif( oldArrTop%2==0 )ます。これで、oldArr割り当てられた要素が 2 つしかなく、3 番目の要素にアクセスしようとした場合 (oldArrTop==2 であり、3 番目の要素を意味するため):

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

を使用するだけstd::vector<T>です。それはあなたのためにメモリを管理します(必要に応じて配列サイズを2倍にします:))

于 2012-06-14T19:37:07.660 に答える