gpt4 book ai didi

c++ - 如何使用移动构造函数正确处理 shared_ptr 的映射?

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

假设我有一个容器 std::map<int, std::shared_ptr<MyClass>>我想用外部函数填充它并避免处理它的内容。所以我有

typedef Container std::map<int, std::shared_ptr<MyClass>>

Container&& f(){
Container bar;
auto foo = std::shared_ptr<MyClass>(new MyClass());
bar.insert(std::make_pair(0,foo));
std::cout<<bar.at(1)->print_smth<<'\n'; //This works
return std::move(bar);
}

int main(){
Container baz(f());
std::cout<<bar.at(1)->print_smth<<'\n'; //This doesn't
// Container baz has element 1, but shared_ptr is invalidated, because it has 0 references.

}

如果我使用传统的复制构造函数,一切都会按预期工作。

最佳答案

太复杂了。为什么不直接说:

int main()
{
Container baz { { 0, std::make_shared<MyClass>() } };

// ...
}

如果您绝对必须使用辅助函数,则必须返回一个对象,而不是悬空引用。像这样:

Container f()
{
return Container { { 0, std::make_shared<MyClass>() } };
}

很难沉溺于比这更乏味的东西,但最后一个,永远不会在家里使用的版本:

Container f()
{
Container bar;
auto p = std::make_shared<MyClass>;

bar[0] = p; // Method #1
// ---- ALTERNATIVELY ---
bar.insert(std::make_pair(0, p)); // Method #2
// ---- ALTERNATIVELY ---
bar.emplace(0, p); // Method #3

return bar;
}

关于c++ - 如何使用移动构造函数正确处理 shared_ptr 的映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12162515/

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