C++面试实现构造、拷贝构造、赋值运算符代码,存在哪些问题?
代码中的全部错误
- 无参构造函数语法+逻辑双重错误:
new char[]语法非法,C++中使用new[]分配数组必须指定长度- 对未初始化的野指针
name直接解引用*name赋值,会直接触发非法访问崩溃 - 赋值目标错误:应该给指针变量
name本身赋值堆地址,而非给它指向的内存赋值,正确写法示例:name = new char[1]{""};
- 拷贝构造函数逻辑完全错误:
- 未给当前对象的
name分配任何内存,直接解引用野指针赋值,同样触发非法访问 - 仅拷贝了原对象
name指向的第一个字符,没有拷贝完整字符串,完全没有实现深拷贝需求 - 未判断原对象
name是否为合法指针,存在空指针访问风险
- 未给当前对象的
- 赋值运算符重载不符合规范且逻辑错误:
- 返回值不符合C++通用约定:赋值运算符应该返回
Employee&类型的自身引用,以支持a = b = c的连等操作,返回void无法实现该语法 - 未处理自赋值场景:如果出现
a = a的调用,先执行delete[] name会直接把自身和右参的name指向的内存同时释放,后续访问直接触发非法访问 - 释放
name内存后直接对野指针解引用赋值,同样触发非法访问,且没有重新分配内存、拷贝完整字符串
- 返回值不符合C++通用约定:赋值运算符应该返回
- 全局逻辑错误:所有涉及
name字符串的操作都没有实现正确的深拷贝,即使解决上述语法错误,如果只是浅拷贝让多个对象的name指向同一块堆内存,会在对象析构时触发double free(同一块内存被多次释放)崩溃,同时存在内存泄漏风险。
本题考察的核心知识点
- C++类四大特殊成员函数(默认构造、析构、拷贝构造、拷贝赋值运算符)的调用时机、语法规范和实现要求
- 深拷贝与浅拷贝的区别:当类成员包含指向堆内存的指针时,必须自定义拷贝构造和赋值运算符实现深拷贝,避免内存管理错误
- C++内存管理规则:
new[]必须和delete[]配对使用,野指针、空指针访问、内存泄漏、double free的常见成因 - 赋值运算符的实现规范:返回自身引用、自赋值校验、异常安全(比如先分配新内存再释放旧内存,避免分配失败导致原对象资源失效)
- C风格字符串的操作逻辑:字符串拷贝需要匹配长度、预留
\0结束符的存储位置
内容的提问来源于stack exchange,提问作者Sachin Palande
相关产品推荐
相关产品推荐

