函数输出参数的指针或局部变量

时间:2017-09-10 20:01:23

标签: c++ c++11

如果我想使用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更好吗?

谢谢,

1 个答案:

答案 0 :(得分:3)

std::map会复制您在其中添加的内容 1 ,因此map拥有提供给b的{​​{1}}副本。这里不需要智能指针,因为func2将处理所有存储的map的销毁。

实际上根本不需要指针。 B可以是func2并使用参考。

1 您可以将指针存储在void Func2(int, B & message);中,std::map将包含指针的副本。指向的数据未被复制,需要外部管理来处理销毁。这是使用智能指针的一个很好的例子,但是在容器中存储指针会破坏使用容器的许多好处,最好避免使用。