You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

删除赋值重载后无法禁用编译器生成的拷贝赋值问题求助

问题根因排查

你代码里的赋值操作没有触发报错的核心原因是:你操作的是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:06:03