1

テンプレート クラスを作成しましたが、動作しますが、何らかの理由で動的割り当てに問題があります。配列の初期の長さ: 古い 2 新しい 4. 最初に機能します (古いポイントが新しい (したがって、現在は彼のサイズ 4)、現在、新しいサイズは 8 です) が、次のラウンドでは - で爆発しdelete [] temp;ますヒープの問題。何か案は?ありがとう

template <class T>
void Log<T>::Add(T item)
{
    // If array is full
    if(m_oldSize == m_oldCount)
    {
        // prepare array switch
        T* temp = m_old;

        // Point to new array
        m_old = m_new;
        m_oldSize = m_newSize;
        m_newSize *= ARRAY_MUL;
        m_newCount = DEFAULT_COUNT;

        //delete old
        delete [] temp;
        temp = NULL;

        //create new array
        m_new = new T[m_newSize];
    }

    // Add item and update new array
    m_old[m_oldCount++] = item;
    if(m_oldCount > FIRST_ROUND)
    {
        m_new[m_newCount++]= m_old[m_newCount];
        m_new[m_newCount++]= m_old[m_newCount];
    }
}
4

1 に答える 1

0

これは宿題なので、エレガントではないソリューションを作成したばかりなので、落とし穴を見つけて拡張できるはずです。

#include <iostream>

using namespace std;

struct foo
{
  foo(int h) : g(h) { }
  int g;
};

template <typename T>
class bar
{
public:
  bar() : curSize(2), curNo(0)
  {
    a = new T[curSize];
  }

  void Add(T item)
  {
    if (curNo == curSize) {
      curSize = 2 * curSize;
      T *newArray = new T[2*curSize];
      for (size_t i = 0 ; i != curNo; ++i) {
        newArray[i] = a[i];
      }
      delete[] a;
      a = newArray;

    }
    a[curNo] = item;
    ++curNo;

  }

  void print()
  {
    for (size_t i = 0 ; i != curNo; ++i) {
      cout << a[i]->g << endl;
    }
  }



private:

  size_t curSize;
  size_t curNo;
  T * a;
};


int main()
{
 foo *f1 = new foo(1);
 foo *f2 = new foo(2);
 foo *f3 = new foo(3);
 foo *f4 = new foo(4);
 bar<foo*> *g = new bar<foo*>();
 g->Add(f1);
 g->Add(f2);
 g->Add(f3);
 g->Add(f4);
 g->print();
 cout << "Add more and print" << endl;

 g->Add(f1);
 g->Add(f2);
 g->Add(f3);
 g->Add(f4);
 g->Add(f3);
 g->Add(f4);

 g->print();

}
于 2012-06-22T07:45:57.717 に答える