公司动态

拷贝构造与赋值:浅拷贝vs深拷贝,面试里最容易踩的坑

📅 2026/7/14 19:44:47
拷贝构造与赋值:浅拷贝vs深拷贝,面试里最容易踩的坑
上篇聊了构造函数和析构函数,今天接着讲它的"兄弟"——拷贝构造和赋值。这个话题在面试里出现频率很高。而且很多人不是不知道概念,而是在具体场景下判断不出该用浅拷贝还是深拷贝。讲个我自己的教训。刚工作不久,写了个传感器数据管理的类。内部用了一个指针数组存数据。我嫌麻烦,没写拷贝构造函数,觉得编译器自动生成的够用了。结果程序跑着跑着就崩了。排查了半天,发现是vector扩容的时候,拷贝了对象,但编译器生成的拷贝构造函数只做了浅拷贝——指针复制了一份,两个对象指向同一块内存。一个对象析构的时候把内存释放了,另一个对象还在用这块内存,直接野指针。从那以后,我对拷贝构造和赋值再也不敢偷懒。拷贝构造函数:什么时候调用拷贝构造函数在三种情况下被调用:第一,用一个对象初始化另一个对象。Sensor s1; Sensor s2 = s1; // 调用拷贝构造 Sensor s3(s1); // 调用拷贝构造第二,函数参数是值传递的对象。void processSensor(Sensor s) { // 值传递,调用拷贝构造 // 处理s } Sensor s1; processSensor(s1); // s1被拷贝一份传给s第三,函数返回一个局部对象(有些编译器会做返回值优化,省略拷贝)Sensor createSensor() { Sensor s; return s; // 可能调用拷贝构造(也可能被RVO优化掉