C++ 保证我的指针内存容器稍后存在?

C++ 保证我的指针内存容器稍后存在?,c++,c++11,C++,C++11,我有一些这样的代码: typedef std::unordered_map<int, A*> MAP; MAP _map; int myMethod(){ B b; const int key = 4; addToMap(key, b); } void addToMap(const int i, B& b){ MAP::accessor a; _map.insert(a, MAP::value_type(I, &b));

我有一些这样的代码:

typedef std::unordered_map<int, A*> MAP;
MAP _map;

int myMethod(){
    B b;
    const int key = 4;
    addToMap(key, b);
}

void addToMap(const int i, B& b){
     MAP::accessor a;
    _map.insert(a, MAP::value_type(I, &b));
}
typedef标准::无序的地图;
地图(MAP),;
int myMethod(){
B B;
const int key=4;
addToMap(键,b);
}
无效添加地图(const int i、B&B){
存取器a;
_插入(a,map::value_type(I,&b));
}
我担心一旦
myMethod()
返回,在堆栈上创建的
B
对象将不存在于我的映射中。我也不能轻易改变地图的界面,因为它在很多地方都有使用

如何处理
addToMap()
,以确保在
myMethod()
返回后不会删除映射元素


我可以强制插入B的副本吗

我想
B
提供了一个复制构造函数

因此:

  • 您不能修改
    typedef std::unordered_映射
  • 您的实际地图应该拥有其指针指向的对象的所有权
  • B
    继承自
    A
    (这可以解释为什么原始代码的作者在
    MAP
    中使用指针)
您可以使用以下代码:

当(且仅当)
B(const B&B)
不抛出时,此代码才有效。如果是这样,
\u map
将包含无效值(nullptr),但不会泄漏内存

但是,在其他方法中,当从地图中删除地图指向的对象时,应小心正确地销毁这些对象。 此外,您应该销毁封闭对象(持有地图的对象)的析构函数中的剩余对象


最后,如果可以,您应该遵循一些建议,即可以使用
unique\u ptr
。如果您的遗留代码在所有权方面设计得很差,那么使用
共享的映射可能是更好的选择。

您可以在堆上创建它。只是别忘了在之后删除它。
std::unordered_map
是不是太大的变化?@Jarod42这可以被认为是库代码,我不是创建B对象的人。据我所知,如果现有对象在堆栈上,我无法将其分配给唯一的\u ptr?我只能将堆内存分配给它们,除非我不知道它们是否在堆或堆栈上,因为它们在接口之外?@mezamorphic,如果您可以将typedef更改为
typedef std::unordered_map然后是,
map::erase()
将删除元素本身。或者,将typedef更改为
typedef std::unordered_map
,然后addToMap需要变成
\u map.insert(a,map::value_type(i,std::make_unique(b));
基本上您需要整理一下内存管理应该如何完成。
// it's useless to pass an int by reference,     
// and you should pass b by const ref
void addToMap(int i, const B& b){
   auto old =  _map[i]; // if _map[i] doesn't exist, insert nullptr, 
                        // if it does, return old value.
   delete old; // if old doesn't exist, old == nullptr
   _map[i] = new B(b);
}