删除赋值重载后无法禁用编译器生成的拷贝赋值问题求助
问题根因排查
你代码里的赋值操作没有触发报错的核心原因是:你操作的是Vehicle类型的指针变量,而非Vehicle对象本身,你声明为delete的是对象的赋值运算符,和原生指针的赋值行为无关。
- 你main函数里的
newVehicleObj=newVehicleObj1是对两个指针变量做赋值,本质是把newVehicleObj1存储的内存地址复制给newVehicleObj,这是C++原生的指针操作,不受类成员重载函数的约束。 - 你额外声明的
Vehicle(const Vehicle*)=delete、Vehicle* operator=(const Vehicle*)=delete属于多余代码,C++标准拷贝构造、拷贝赋值的入参都是引用类型,这两个重载永远不会被默认拷贝语义触发。
修正方案
1. 保留必要的禁用逻辑
只需要保留标准拷贝语义的禁用声明即可,多余的指针参数版本可以删掉:
// 保留这两行就足以禁止对象的拷贝构造和拷贝赋值 Vehicle(const Vehicle&)=delete; Vehicle& operator=(const Vehicle&)=delete; // 注意标准拷贝赋值的返回值是T&,你原来写的void也可以用,但不符合常规写法
2. 验证禁用效果
如果要触发赋值禁用的报错,需要直接对Vehicle对象做赋值操作,示例测试代码如下:
int main() { std::string name="shrikant"; std::string address="Indi"; Vehicle a(9876,2021,200000,name,address); Vehicle b(987,2022,300000,name,address); a = b; // 这一行会直接编译报错,提示拷贝赋值运算符已被删除,符合你的需求 return 0; }
3. 额外问题优化
你的代码当前存在内存泄漏风险:Vehicle构造函数里new了OwnersList对象,但没有对应的析构函数释放内存,建议补充析构函数:
~Vehicle() { delete _listOfOwners; // 注意如果OwnersList是链表结构,需要遍历释放所有节点的内存 }
内容的提问来源于stack exchange,提问作者Shrikant B
相关产品推荐
相关产品推荐

