0

私はヘッダーファイルを持っています:

using namespace std;

class IntList{
private:
    int *Intl;
    int Capacity;
    int Count;
public:
    IntList(int capacity){
        Capacity = capacity;
        Count = 0;
        Intl = new int[capacity];
    }

    ~IntList(){
        delete Intl;
    }

    //adds the integers of the specified collection to the end of the List; return false if the new Count will be greater than Capacity
    bool AddRange(const IntList &items){
        //int *Temp = items.;
        if(items.Count > Capacity - Count){
            return false;
        }else{
            for(int i = 0; i <items.Count; i++){
                Intl[Count] = items.Intl[i];
                Count++;
            }
            return true;
        }
    }
};

しかし、そこにある IntList オブジェクトに値を返せない理由がわかりません:

//creates a copy of a range of elements in the source List
        IntList GetRange(int index, int count){
            IntList A(count);
            for(int i = 0; i < count; i++){
                A.Intl[i] = Intl[index -1 +i];
            }   
            return A;
        }

A型の値を返したいのですIntListが、Visual Studio 2010 でエラーが発生し"_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)ました。どうすれば修復できますか?

4

2 に答える 2

3

は手動で管理するオブジェクトであるためint *Intl;、クラスのコピー コンストラクターを実装する必要があります。

関数GetRangeは値で戻ります。ローカル オブジェクトAは破棄され、そのメンバーIntlはデストラクタで削除されるため、コピー (デフォルトのコピー コンストラクタによってコピーされる) は浅いものに過ぎず、無効なメンバーが含まれます。

編集:Robが正しく指摘したように、代入演算子も実装する必要があります(すでにデストラクタがあります)。

于 2012-04-30T18:47:38.597 に答える
1

値によって返されるオブジェクトの場合は、copy-constructor .適切な結果が得られるように、コピー コンストラクターを作成して定義する必要があります。参照による戻りは、実際にはコピー コンストラクターの呼び出しを必要としませんが、一時オブジェクトに対して行うべきではありません。また、 class のメンバー変数としてポインター型があるためです。=演算子をオーバーロードするのが適切です。を避けるために適切に定義する必要がありますmemory leak。このようなことをしてくださいIntlist a=GetRange(index,count)。また、この のコピー コンストラクターを作成する必要があります。=コードには、クラス Intlist の演算子をオーバーロードしないというバグもあります。

次のようなコピーコンストラクタを書くことができます:-

   Intlist::Intlist(const Intlist& cSource)
   {         
     capacity = cSource.capacity; 
     count=  cSource.count;
    // Intl is a pointer, so we need to deep copy it if it is non-null
    if (cSource.Intl)
     {
       // allocate memory for our copy
      Intl = new int[capacity];

    // Copy the Intl into our newly allocated memory in for loop
     for(i=0;i<capacity;i++)
     {
       // copy part
      }
    }
    else
    intl = NULL;
  }

たとえば、どのように書くべきか。

于 2012-04-30T19:21:24.310 に答える