如果我想使用map中元素的值作为函数的输出参数,最好将其声明为智能指针还是本地?
例如:
// .h
class A {
private:
// Is the below code preferred over
// std::map<int, std::unique_ptr<B>>?
std::map<int, B> map;
public:
void Func1();
// Message is the output parameter
void Func2(int, B* message);
}
// .cc
void A:: Func1() {
B b;
// Is it better to make b a smart pointer and use std::move
// to transfer the ownership to map?
map.insert(std::make_pair(1, b));
for (const auto& x : map) {
Func2(x->first, &x->second);
}
}
在上面的例子中,为b声明一个智能指针并将指针传递给Func2更好吗?
谢谢,
答案 0 :(得分:3)
std::map
会复制您在其中添加的内容 1 ,因此map
拥有提供给b
的{{1}}副本。这里不需要智能指针,因为func2
将处理所有存储的map
的销毁。
实际上根本不需要指针。 B
可以是func2
并使用参考。
1 您可以将指针存储在void Func2(int, B & message);
中,std::map
将包含指针的副本。指向的数据未被复制,需要外部管理来处理销毁。这是使用智能指针的一个很好的例子,但是在容器中存储指针会破坏使用容器的许多好处,最好避免使用。