In het programma heb ik een configuratie-klasse aangelegd (deze heet Config). Deze klasse beheert een controller en een vector met een root Map:
Van de Config wordt door de applicatie eenmalig een instantie gemaakt (*oConfig). Deze wordt bij het aanmaken van maps in de mapcontroller weer doorgegeven aan een Map:
In verdere code raakt de lokale (private) m_parent illegaal. Daarmee bedoel ik dat deze nog steeds verwijst naar het stukje geheugen dat bij de MapController was geallocceerd (of eigenlijk door Config zelf). Echter de std::vector wijzigt dit volgens mij naar gelang de vector gevuld wordt. Maar hoe kan ik dan in een Map een referentie leggen naar zijn parent(-Map)? Kan ik op de een of andere manier het interne ID van een waarde die de vector gebruikt achterhalen en die als referentie opgeven?
Het speelt dus bijvoorbeeld wanneer ik de std::vector maps itereer. In de debugger zie ik dan m_parent naar een geheugenadres verwijzen die hetzelfde is als bij initiatie ten tijden van initMaps() echter staat er nu garbage in zodat er een SEGFAULT of iets soortgelijks ontstaat.
C++:
De constructor initieert de rootMap en mapcontroller, zie hier:1
2
3
4
5
6
7
8
9
10
11
12
13
| class Config{ public: Config(); // rootmap Map *rootMap; // vector met maps std::vector<Map> maps; // Controller to handle Maps MapController *mapcontroller; } |
C++:
1
2
3
4
5
6
7
| Config::Config() { mapcontroller = new MapController(this); // set up the root map rootMap = new Map(this,0,""); maps.push_back(*rootMap); } |
Van de Config wordt door de applicatie eenmalig een instantie gemaakt (*oConfig). Deze wordt bij het aanmaken van maps in de mapcontroller weer doorgegeven aan een Map:
C++:
Definitie van Map met implementatie:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| class MapController { public: MapController(Config *); void initMaps(); private: Config *oConfig; } MapController::MapController(Config *oConfig) { this->oConfig = oConfig; } void MapController::initMaps() { Map *oMap; std::string sName = ""; // [..] zet name e.d. oMap = new Map(oConfig, oConfig->rootMap, sName); oConfig->maps.push_back(*oMap); } |
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
| class Map{ public: Map(Config*, Map*, std::string = ""); private: Config *oConfig; std::vector m_parent, m_name; } Map::Map(Config *config, Map* parent, std::string name) { oConfig = config; m_parent = parent; m_name = name; } |
In verdere code raakt de lokale (private) m_parent illegaal. Daarmee bedoel ik dat deze nog steeds verwijst naar het stukje geheugen dat bij de MapController was geallocceerd (of eigenlijk door Config zelf). Echter de std::vector wijzigt dit volgens mij naar gelang de vector gevuld wordt. Maar hoe kan ik dan in een Map een referentie leggen naar zijn parent(-Map)? Kan ik op de een of andere manier het interne ID van een waarde die de vector gebruikt achterhalen en die als referentie opgeven?
Het speelt dus bijvoorbeeld wanneer ik de std::vector maps itereer. In de debugger zie ik dan m_parent naar een geheugenadres verwijzen die hetzelfde is als bij initiatie ten tijden van initMaps() echter staat er nu garbage in zodat er een SEGFAULT of iets soortgelijks ontstaat.
[ Voor 6% gewijzigd door LauPro op 26-11-2006 03:47 ]
Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!