问题:
我用 unordered_map<long int, trade *> id_map; 来保存一组 trade类型数组元素( vector<trade> trade_list )的映射表
并且用 id_map[id] = &trade_list.back(); 的方式向 id_map 追加 id => trade 对象的映射信息,
这样写有什么隐患?
解答:
使用 unordered_map<long int, trade *> id_map 来保存一组 trade 类型数据的映射表,并使用 b_id_map[id] = &trade_list.back() 的方式向 id_map 追加 id => trade 类型的映射信息存在以下潜在隐患:
指针的有效性:使用指针来引用 trade 对象时,需要确保指针指向的对象仍然有效。如果在后续操作中,从 trade_list 中删除了与指针关联的 trade 对象,那么指针将变成悬空指针,使用它可能导致未定义的行为。
内存泄漏:在使用指针的情况下,需要确保在不再需要时正确释放内存。如果忘记手动释放通过 new 创建的 trade 对象,将导致内存泄漏。
容器失效:如果在 trade_list 的生命周期内,有元素被添加或删除,可能会导致指向 trade_list 元素的指针失效。这是因为 trade_list 的内存可能会重新分配,导致指针指向无效的内存位置。
潜在的并发问题:如果在多线程环境下使用 id_map 和 trade_list,并且对它们进行并发修改,可能会出现竞态条件和数据不一致的问题。在这种情况下,需要采取适当的同步机制来确保线程安全性。
为了避免上述潜在问题,可以考虑以下改进:
使用智能指针:可以使用 std::unique_ptr 或 std::shared_ptr 来管理指针的生命周期,以避免手动释放内存和悬空指针的问题。
使用值类型而不是指针:如果可能的话,将 trade 对象直接存储在 id_map 中,而不是使用指针。这样可以避免指针相关的问题。
使用容器的索引而不是指针:如果 trade_list 是一个容器(如 std::vector),可以使用索引值而不是指针来引用 trade 对象。这样可以避免指针失效的问题。
考虑线程安全性:如果在多线程环境下使用 id_map 和 trade_list,确保采取适当的同步机制,如互斥锁或原子操作,以保证线程安全性。
综上所述,使用指针来保存映射信息需要小心处理,以避免潜在的问题。考虑使用智能指针、值类型或容器索引,并注意线程安全性,以确保代码的正确性和健壮性。
对回答的结果进行总结,应该是 容器失效
在 trade_list 的生命周期内,有元素被添加或删除,可能会导致指向 trade_list 元素的指针失效。
trade_list 的内存可能会重新分配,导致指针指向无效的内存位置。
临时的解决方法是 id_map 改为 储存 trade_list 的索引值,而不是特定元素的地址
代码: 全选
unordered_map<long int, long int> id_map;
trade_list.push_back( trade( ... ) );
id_map[key] = trade_list.size()-1;