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 回答