调试我的代码时出错配置大小无效

时间:2014-06-02 10:51:56

标签: arrays visual-c++ runtime-error

我正在实现schaum用c ++编写的书中给出的代码,我得到了这个调试错误“ 无效分配字节446578765(这样的数字) ”。我正在学习c ++有人可以帮助为什么会出现这个错误吗?

`

#include <iostream>
using namespace std;

template <class T>
class Vector
{
public:
    Vector(unsigned arg=8):size(arg),data(new T[arg]){}  // constructor
    Vector(const Vector<T> &v ):size(v.size),data(new T[size]) // copy constructor
        {
      copy(v);
    }
    ~Vector(){delete [] data;}//destructor
    Vector <T>& operator = (const Vector<T>&); // assignment operator
    T& operator [] (unsigned i) const { return data[i];}
    unsigned _size()
    {
      return size;
    }

private:
    T* data;
    unsigned size;
    void copy(const Vector<T> &);

};

template<class T>
Vector<T>& Vector<T>::operator=(const Vector<T> & v)
{
    size = v.size;
    data = new T[size];
    copy(v);
    return *this;

}

template<class T>
void Vector<T>::copy(const Vector<T> &v)
{
    int min_size=(size<v.size?size:v.size);

    for(short int i=0;i<min_size;i++)
    {
        data[i]=v.data[i];
    }
}


int main()
{
  Vector<int> obj;

  obj[2]=27;

  Vector<int> w=obj,x;
  cout<<w._size();
}

`

1 个答案:

答案 0 :(得分:1)

构造函数按照它们在类定义中列出的顺序初始化数据成员 - ,按照它们在构造函数初始化列表中列出的顺序。一个很好的例子:

template <class T>
class Vector
{
public:
    Vector(const Vector<T> &v ):size(v.size),data(new T[size]) {...}
private:
    T* data;
    unsigned size;
};

初始值设定项列表会建议先size初始化为v.size,然后使用刚刚设置的new T[size]值执行size

但事实并非如此。实际上,由于data在类定义中排在size之前,因此首先执行new T[size] - 此时,size仍然未初始化,包含随机垃圾。此代码表现出未定义的行为。

成功

    Vector(const Vector<T> &v ):data(new T[v.size]), size(v.size) {...}