【提问博客】C++拷贝构造函数玄学bug

由于本人较为菜鸡,专业也不是计算机,编程对我形成的概念和程序员是大相径庭,以前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
在拷贝构造函数内执行sz(size())
可见,此时this.sz,并不等于other.sz,是一个随机数。
完成sz(size())

执行此步后,新对象的sz便是该随机数。申请动态内存,直接内存不够。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值