2011-08-15 5 views
1

私は宿題をしていますが、私はクラステンプレートであまり好きではありません。クラステンプレートに問題があります

タスクは次のとおりです。

次のクラスの実装における主要な問題はあります。あなたはそれを見つけることができますか?どうすれば の問題を解決できますか? というクラスの要件仕様に応じて、複数のソリューションを提案できます。

template <class T> 
class Array 
{ 
private: 
    T *m_pData; 
    unsigned int m_nSize; 

public: 
    Array(unsigned int nSize) : m_nSize(nSize) 
    { 
    if(m_nSize > 0) 
     m_pData = new T[m_nSize]; 
    } 

virtual ~Array() 
    { 
    if(m_pData != NULL) 
     delete m_pData; 
    } 
bool Set(unsigned int nPos, const T& Value) 
    { 
    if(nPos < m_nSize) 
    { 
     m_pData[nPos] = Value; 
     return true; 
    } 
    else 
     return false; 
    } 

    T Get(unsigned int nPos) 
    { 
    if(nPos < m_nSize) 
     return m_pData[nPos]; 
    else 
     return T(); 
    } 
}; 

は私に関する限りメモリリークがあります。あなたは他のいくつかの問題を見つけますか?

+0

メモリリークはありません(デストラクタによってメモリが解放されるため)が、正しい行に沿って考えています。少なくとも3つの大きな問題があります。 –

答えて

1

コンストラクタにはelseのないifがあります。その結果を考えてみましょう。
新しい[]がdelete []に​​一致し、newがdeleteで一致していることを確認してください。
これは3のルール(またはC++ 0xの5)に違反します

これは私が見るものです。

+0

もしこれが単なる宿題であれば、私はC++ 0xの問題が – calccrypto

2
  1. コンストラクタ - あなたはif文がデストラクタで必要とされていないので、あなたはヌルポインタを削除することができます0
  2. さnsizeの場合のイベントにm_pDataの値を設定する必要があります。削除は、[]
+0

と表示されるのではないかと疑問に思います。私が気付かなかった私の職場では、削除前のチェックがとても一般的です。それはバグではなく、微妙なパフォーマンスのものですが、問題は「問題」を求められたので、それは重要だと思います。 –

0

HERESにいくつかのことを削除する必要がありますが、私はそれらのいずれかが正解であることが十分に深刻であることを疑う:

  1. get機能が無効なインデックスの値を返します。 。 type Tintで、インデックスが大きすぎるとgetを使用した場合、得られる回答は0になります。値が0の場合はどうなりますか? 0の値と無効なインデックス値の違いをどのように伝えますか?

  2. いくつかの余分なコードがあります:あなたは何のコピーコンストラクタや代入演算子はありませんelse return

+0

右は、境界エラーの例外をスローする必要があります。 –

1

を必要といけません。このコードは非常に速くプログラムをクラッシュさせます。それが大きな欠陥です。

デストラクタを仮想にすることは奇妙な決定です。このクラスから派生する必要性や利点は明らかではありません。

私はスワップメソッドも実装します。

+0

「複数のソリューションを提案する」というのは、明らかにコピーコンストラクタと代入演算子を実装する正しい解決法、またはそれらをプライベートと宣言するという怠惰な解決策のいずれかを指しています。 – john