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);
}