我正在实现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();
}
`
答案 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) {...}