将堆对象分配给std::map
Assigning heap objects to a std::map
运行时会崩溃。
std::map<std::string, MyClass> myMap;
myValue = new MyClass();
myMap["myKey"] = *myValue;
我有两个要求:
- MyClass的实例保存在堆上(因此使用new);
- 我能够通过关联数组引用这些(因此使用std::Map)。
为什么我不能在示例中成功使用解引用操作符?我怎样才能同时做到这两点呢?
p。
您可以使用boost或tr1 shared_ptr:
std::map<std::string, shared_ptr< MyClass > > myMap;
myValue = shared_ptr< MyClass >( new MyClass() );
myMap["myKey"] = myValue;
如果您失去了myValue
的作用域,那么它就是内存泄漏。因此,最好将MyClass*
存储在您的地图中。
std::map<std::string, MyClass*> myMap;
myValue = new MyClass();
myMap["myKey"] = myValue;
在给定的示例中,还确保在从map<>
擦除或删除时delete
元素。如果你不想担心内存管理,你可以使用智能指针(例如boost::shared_ptr
)。
也,从你给出的例子,我不知道为什么它应该崩溃,而解引用*myClass
。你是否在复制构造函数MyClass::MyClass(const MyClass&)
中做了一些奇怪的事情?
您的最后一行在映射中创建了一个新的MyClass
实例,并对其调用赋值操作符。我假设你的对象中有一些指针,当你试图释放一些内存两次时,你会得到一个错误。
std::map<std::string, MyClass*>
并相应地处理内存管理,或者,如stijn所说,使用某种形式的shared_prt
。
您正在第2行创建一个新对象并将其复制到映射中。您可能正在寻找boost::ptr_map.
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 使用一个考虑到std::map中键值的滚动或换行的键
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- C++如何创建 std::map
- 从其他容器中移动构造"std::map"
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 使用重载 [] 运算符返回 std::map() 的可赋值
- std::map, std::unordered_map - 缩小初始值设定项列表中的转换范围
- C++ 使用枚举类对象分配 std::map 值
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- std::map:当元素不可默认构造时创建/替换元素
- Arduino编译器和STL:使用std::vector和std::map