考虑我有一个班级人物。我在地图中存储指向这些人的指针
map<string, People*> myMap;
要创建新人,我使用maps []运算符。
myMap["dave"]->sayHello();
但是这给了我一个分段错误,它甚至都没有调用People类的构造函数。
我也试过
myMap.insert( std::make_pair( "dave", new People() ));
但是这没有改变任何东西,构造函数仍然没有被调用,程序关闭处理这段代码时出现分段错误。
如何使用指针访问和操作地图?为什么上面没有工作,我没有编译时错误或警告。
非常感谢任何见解,谢谢
答案 0 :(得分:9)
鉴于地图:
map<string, People*> myMap;
operator[]
不会创建新的People
,它会创建People*
,即指向不指向任何内容的指针。
最简单的解决方案是让你的地图真正包含人,而不是指针,例如:
map<string, People> myMap;
然后内存管理全部为您处理,使用operator[]
将根据需要构建新人。
答案 1 :(得分:2)
尝试
myMap["dave"] = new People(....);
new
将调用构造函数,返回一个指针并将其插入到地图中。
但是你需要注意内存泄漏。使用智能指针来解决这个问题。
答案 2 :(得分:0)
如果要堆积分配People
但使用地图,请查看Boost Pointer Containers,特别是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;
}
答案 3 :(得分: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) );
两者都有效!!!