由于本人较为菜鸡,专业也不是计算机,编程对我形成的概念和程序员是大相径庭,以前c++从没学到真谛,其实就是当c用的。所以,最近开始认(xia)真(ji)学(ba)习(gao)。。。
学习中遇到问题,记录一下,恳请大佬们带带我。
1. 问题
按某教程,在以下代码中写了一个Vector类。
其中有个拷贝构造函数,执行中报错std::bad_alloc。
搜索知此错误为内存不够。。。但是,程序就申请了一个4个元素的vector。百思不得其解。调试中发现,在调用拷贝构造函数时,已有的类变量的size()无法赋值给新申请的类中私有成员sz。
size()是一个非常大的数字,而不是元素值。
更玄学的是,这段代码在二十几个小时之前是正常的。。。昨天晚上开始不正常了。头大。。。。
请明白怎么回事的大佬教教我。。。。
2. 代码
class Vector {
private:
size_t sz;
double* elem;
public:
Vector(std::initializer_list<double> lst)
:elem{new double[lst.size()]},
sz{lst.size()}
{
std::copy(lst.begin(),lst.end(),elem);
}
Vector(size_t size)
:sz(size),elem{new double[sz]}
{
}
double& operator[](int i){
return elem[i];
}
size_t size()
{
return sz;
}
//bug的地方
Vector(const Vector& other)
//:sz(other.sz),//这样可以,不过下面的是按教程写的哇,一天前还是正常的。
:sz(size()),//真正的bug点——这类size()没有返回other.sz,而是一个很大的数字。。。
elem(new double[sz])
{
for (int i = 0; i < sz; i++)
{
elem[i]=other.elem[i];
}
}
~Vector() {}
};
int main()
{
Vector v2 {1,1,2,3};
Vector v3=v2;
return 0;
}
部分调试截图
other.sz=4
可见,此时this.sz,并不等于other.sz,是一个随机数。
执行此步后,新对象的sz便是该随机数。申请动态内存,直接内存不够。