如何处理带有指针的地图
How to handle a map with pointers?
考虑我有一个类名人。我在地图上存储指向这些人的指针
map<string, People*> myMap;
要创建新的人,我使用地图 [] 运算符。
myMap["dave"]->sayHello();
但这给了我一个分段错误,它甚至没有调用 People 类的构造函数。
我也试过
myMap.insert( std::make_pair( "dave", new People() ));
但这并没有改变任何东西,构造函数仍然没有被调用,程序会关闭处理此代码并出现分段错误。
如何访问和操作包含指针的地图?为什么上述不起作用,我没有收到编译时错误或警告。
任何见解非常感谢,谢谢
给定地图:
map<string, People*> myMap;
operator[]
不会创建新的People
,而是会创建People*
,即不指向任何东西的指针。
最简单的解决方案是使您的地图真正包含人物,而不是指针,例如:
map<string, People> myMap;
然后内存管理全部为您处理,使用 operator[]
将根据需要构建新人。
尝试
myMap["dave"] = new People(....);
new
将调用构造函数,返回一个指针并将其插入到映射中。
不过,您需要小心内存泄漏。使用智能指针来克服这个问题。
如果你想堆分配你的People
但使用地图,看看一个提升指针容器,特别是boost::ptr_map
。它只是标头,因此您无需编译任何额外的库。
#include <iostream>
#include <string>
#include <boost/ptr_container/ptr_map.hpp>
struct People
{
int age;
};
typedef boost::ptr_map<std::string,People> PeopleMap;
int main(int,char**)
{
PeopleMap data;
data["Alice"].age = 20;
data["Bob"].age = 30;
for (PeopleMap::const_iterator it = data.begin(); it != data.end(); ++it)
std::cout << "Name: " << it->first << " Age: " << it->second->age << std::endl;
return 0;
}
尝试使用:
People* new_people = new People (member_variable1,member_variable2);
myMap.insert(std::pair<std::string, People*>("key for string",new_people) );
或其他方式:
People new_people(member_variable1,member_variable2);
myMap.insert(std::pair<std::string, People*>("key for string",&new_people) );
两者都会起作用!!
相关文章:
- 从矢量或地图中删除共享指针
- 如何将元素插入到标准::地图的共享指针中?
- 无法将智能指针插入地图
- 从地图复制到指针列表
- EIGEN地图类:将C阵列映射到VectorXD指针以有效的方式
- 如何在地图中使用结构指针
- 为什么通用参考概念不适用于函数指针的地图插入
- C 通过指针的地图进行迭代
- 从地图擦除后访问指针
- C 如何在地图指针中的键增量值
- std ::地图没有父母指针
- 如何在两个包含指针的地图中创建列表
- 如何将模板函数指针作为值参数添加到地图中
- 使用地图模板函数指针
- 在Unorderd地图中删除指针
- 通过EMPLEPE()将对象指针插入地图中
- 如何在具有非常量指针键的地图中通过常量指针键查找
- 如何通过向量/地图对对象使用多个指针
- 分割故障,可能的原因:功能指针,多线程,STL地图等
- 如何从地图返回标准::p空气的指针并将其放入vector<*std::p air...>