gpt4 book ai didi

c++ - 使用 std::move 和 std::shared_ptr 有什么好处和风险(如果有的话)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:19:05 26 4
gpt4 key购买 nike

我正在学习 C++11 的特性,作为其中的一部分,我首先进入了 unique_ptrshared_ptr 的世界。

开始时,我编写了一些专门使用 unique_ptr 的代码,因此当我传递我的变量时,我需要使用 std::move 来完成它(或者让我明白)。

经过一番努力,我意识到我确实需要 shared_ptr 而不是我正在做的事情。稍后快速查找/替换,我的指针被切换到共享,但我懒洋洋地只是留下了 move() 调用。

令我惊讶的是,它不仅可以编译,而且在我的程序中表现得非常好,我得到了我期望的每一点功能......特别是,我能够“move ”一个 shared_ptr 从 ObjectA 到 ObjectB,并且两个对象都可以访问它并可以操作它。太棒了。

虽然这对我提出了问题...现在我在 shared_ptr 上,move() 调用实际上在做任何事情吗?如果是这样,它的后果是什么?

代码示例

shared_ptr<Label> lblLevel(new Label());

//levelTest is shared_ptr<Label> declared in the interface of my class, undefined to this point
levelTest = lblLevel;

//Configure my label with some redacted code

//Pass the label off to a container which stores the shared_ptr in an std::list
//That std::list is iterated through in the render phase, rendering text to screen
this->guiView.AddSubview(move(lblLevel));

此时,我可以对 levelTest 进行重要更改,例如更改文本,这些更改会反射(reflect)在屏幕上。

对我来说,这让列表中的 levelTest 和 shared_ptr 看起来好像是同一个指针,而 move() 实际上并没有做太多事情。这是我的业余解读。寻找洞察力。在 Windows 上使用 MinGW。

最佳答案

ecatmur 的回答从一般意义上解释了事物表现如您所见的原因。

特别针对您的情况,levelTestlblTest拷贝,它创建了对共享资源的额外拥有引用。您从 lblTest 移出,因此 levelTest 完全不受影响,并且它对资源的所有权保持不变。

如果您看过 lblTest,我相信您会发现它已设置为空值。因为您在从 shared_ptr move 之前复制了它,所以指针的两个现有事件实例(levelTestguiView 中的值>) 应该引用相同的底层指针(它们的 get 方法返回相同的值)并且应该至少有两个引用(它们的 use_count 方法应该返回 2,如果您制作了额外的拷贝,则更多)。

shared_ptr 的全部意义在于启用您所看到的东西,同时在所有 shared_ptr 实例被销毁时仍然允许自动清理资源。

关于c++ - 使用 std::move 和 std::shared_ptr 有什么好处和风险(如果有的话),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22975453/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com