gpt4 book ai didi

c++ - 为什么 make_shared 会破坏右值引用?

转载 作者:行者123 更新时间:2023-11-28 01:19:16 36 4
gpt4 key购买 nike

我正在尝试了解我应该如何有效地使用智能指针,并且我很好奇它们如何与右值引用一起工作。为什么 std::make_shared(可能还有 make_unique)使用复制语义而不是 move 语义?

这是一个 gtest 测试,展示了我想说的内容

#include <memory>
int dtor_calls = 0;
struct MoveSemanticsTest1 {
int data;
~MoveSemanticsTest1() { dtor_calls++; }
};

void reset_move_dtor_calls() {
dtor_calls = 0;
}

TEST(MoveSemanticsSanityTest1, SanityTests) {
reset_move_dtor_calls();
{
MoveSemanticsTest1 a = MoveSemanticsTest1();
}
EXPECT_EQ(1, dtor_calls); // <-- This passes, makes sense
reset_move_dtor_calls();
{
MoveSemanticsTest1 b = {3};
auto a = std::make_shared<MoveSemanticsTest1>(std::move(b));
}
EXPECT_EQ(1, dtor_calls); // <-- This fails, why?
reset_move_dtor_calls();
{
MoveSemanticsTest1 b = {3};
auto a = std::make_shared<MoveSemanticsTest1>(b);
}
EXPECT_EQ(2, dtor_calls); // <-- This passes, makes sense because of the copying
}

第二个 EXPECT_EQ 失败,这暗示 move 的 b 资源实际上并没有 move 资源。

最佳答案

reset_move_dtor_calls();
{
MoveSemanticsTest1 b = {3}; //1
auto a = std::make_shared<MoveSemanticsTest1>(std::move(b)); //2
//3
//4
}

在 1) 中,您创建了一个 MoveSemanticsTest1

在 2) 中,您通过 move 构造创建了一个 MoveSemanticsTest1,并将其提供给 shared_ptrb 处于“已移出”状态,但仍在此处。

在 3) 中,你销毁了 shared_ptr => 它销毁了它的 MoveSemanticsTest1

在 4) 中,您销毁了 MoveSemanticsTest1 b

我计算了 2 次对析构函数的调用。

关于c++ - 为什么 make_shared 会破坏右值引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57339070/

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