I have a private field
std::map<std::string, std::multiset<GraphObject*>>* the_Map;
How can I allocate memory for it and insert a GraphObject?
Do I have to use the new operator?
the_Map = new map<string,multiset<GraphObject*>>;
And how can I insert a new GraphObject?
It’s part of a datastructure and I really need a pointer to a map.
It doesn’t want to be a pointer at all; just make the map itself a member of the class and memory allocation will happen automatically.
Correctly inserting an object is rather fiddly, since you’re storing pointers there too. If it doesn’t need to be a pointer, then storing objects would make your life much easier. If it really does have to be a pointer (e.g. because
GraphObjectis a polymorphic base class), I would recommend storing smart pointers:std::unique_ptr, orstd::tr1::shared_ptrorboost::shared_ptrif you’re stuck in the past.If you really, really need to use raw pointers for some insane reason, then the closest you can get to an exception-safe insertion is probably:
or if you don’t care about the possiblity of memory leaks on insertion failure:
Also don’t forget to delete each object when you remove it; that won’t happen automatically.
No you don’t. But if you really believe you do, and want to ignore everyone’s advice not to, then you’ll need an actual map to point to. I would recommend that you make this map a member of the class, so that its lifetime is managed automatically.
If you really want to make life difficult for whoever maintains the code, then I suppose you could allocate one with
new. In that case, remember to delete it when you’ve finished with it; probably in the class destructor. And if you do that, remember the Rule of Three and implement or delete the copy constructor and copy-assignment operator, since the default implementations will do the wrong thing.