fisheepaa 2023-05-13 11:20 采纳率: 50%
浏览 9
已结题

关于#c++#的问题:而在转移所有权之后打印a会报错,即使这样a的print方法任然可以执行

unique_ptr的被移除所有权的对象任然能执行原先的方法:

#include<iostream>
#include<memory>
#include<string>
#include<map>

class Entity{
public:
    Entity(){
        std::cout<<"构造函数\n";
    }
    void print(){
        std::cout<<"good job\n";
    }
    ~Entity(){
        std::cout<<"析构函数\n";
    }
};

int main(){

    std::unique_ptr<Entity> a(new Entity());
    std::unique_ptr<Entity> b = std::move(a);
    // std::cout<<a<<" "<<b;
    a->print();
    b->print();
    return 0;
}

执行结果如下:

构造函数
good job
good job
析构函数

而在转移所有权之后打印a,则会报错,即使这样a的print方法任然可以执行,这是为什么。

  • 写回答

3条回答 默认 最新

  • 社区专家-Monster-XH 2023-05-13 11:40
    关注

    基于Monster 组和GPT的调写:

    • 在代码中,使用了std::unique_ptr来管理Entity对象的所有权。当调用std::move(a)时,所有权从a转移到了b,这意味着b现在拥有了Entity对象的所有权,而a不再拥有。
    • 当你调用a->print()时,虽然a不再拥有对象的所有权,但它仍然保留了指向对象的指针。因此,调用a->print()仍然可以正常执行,因为指针仍然有效。
    • 然而,当程序结束时,b被销毁并调用其析构函数,因为它拥有对象的所有权。因此,在程序结束时,你会看到析构函数的输出。
    • 而如果你尝试打印a,会导致错误。因为a不再拥有对象的所有权,它不再指向有效的对象。所以,当你尝试访问a时,会出现未定义行为。在这种情况下,你可能会遇到程序崩溃或产生其他不可预测的结果。
    • 总之,移动所有权后,被移除所有权的对象可以继续执行其方法,但需要注意确保不要访问已经失效的指针。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月26日
  • 已采纳回答 5月18日
  • 创建了问题 5月13日

悬赏问题

  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真
  • ¥15 关于#c语言#的问题,请各位专家解答!
  • ¥15 这个如何解决详细步骤
  • ¥15 在微信h5支付申请中,别人给钱就能用我的软件,这个的所属行业是啥?