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

C++ 函数输出参数的指针或局部变量,c++,c++11,C++,C++11,如果我想使用映射中元素的值作为函数的输出参数,那么最好将其声明为智能指针还是本地 例如: // .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

如果我想使用映射中元素的值作为函数的输出参数,那么最好将其声明为智能指针还是本地

例如:

// .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);
   }
}
/.h
甲级{
私人:
//以下代码是否优先于以下代码
//地图?
地图;
公众:
void Func1();
//Message是输出参数
void Func2(int,B*消息);
} 
//.cc
void A::Func1(){
B B;
//将b设为智能指针并使用std::move是否更好
//要将所有权转移到地图?
映射插入(std::make_pair(1,b));
用于(常量自动和x:map){
Func2(x->first,&x->second);
}
}
在上面的示例中,为b声明智能指针并将指针传递给Func2是否更好


谢谢,

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

事实上,根本不需要指针<代码>功能2可以是
无效功能2(int、B和message)并使用引用


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

如果不知道
B
,没有更好的方法。