std:: bad alloc
-
Hi zusammen!
Also eine weitere Frage:
beim Aufruf der Methode:.
Node& NodePool::createNode(GNG_Parameters& gng_parameters, NodePool& nodepool) { Node newNode = Node(gng_parameters, nodepool); // Konstruktor int actualNodeId_int = *newNode.getNodeId(); // vergibt Node eine ID nodelist_list.push_back(newNode); // fügt Node is Liste ein existingNodes[actualNodeId_int] = true; // setzt Node auf existing return newNode; }Wir ein Node Objekt erstellt. Daraufhin wird eine Referenz auf das Node Objekt zurückgegeben.
Aufgerufen wird diese Methode von einer anderen Klasse:
Node firstNode = nodepool.createNode(gng_parameters,nodepool);Wieso erhalte ich immer
std::bad_alloc'
what(): std::bad_alloc
Ich dachte das bekomme ich wenn ich dynamische Objekte erstelle und da etwas schief geht.
-
Na, irgendwo wirst du wohl ein new drin haben. Was ist denn mit
nodelist_list.push_back(newNode);? Da wird im push_back bestimmt ein new gemacht, wenn nötig. Hast du keinen vernünftigen Debugger?
-
Also ich habe dies jetzt wie folgt gelöst/umgangen
ich rufe die Methode createNode wie folgt auf:
Node firstNode; nodepool.createNode(gng_parameters,nodepool,firstNode);Also erstelle zuerst einen default Node und übergebe daraufhin eine Referenz dieses Nodes an die Methode createNode.
Node& NodePool::createNode(GNG_Parameters& gng_parameters, NodePool& nodepool, Node& actualNode) { actualNode = Node(gng_parameters, nodepool); int actualNodeId_int = *actualNode.getNodeId(); nodelist_list.push_back(actualNode); existingNodes[actualNodeId_int] = true; return actualNode; }
-
Nein, ein new habe ich nirgendwo drinnen.
-
Du gibst eine Referenz auf ein lokales Objekt zurück. Das alleine ist schon nicht erlaubt. (auf das dich der Compiler auch hinweist!).
Das Objekt wird am Ende der Funktion auch bereits wieder zerstört und somit ist die Referenz ungültig. Und alles, was du nachher damit machst ist undefiniert.btw:
Kommt es dir selber nicht komisch vor, dass du eine create Funktion hast, aber nirgends Speicher anforderst?! - Das alleine sollte dich schon stutzig machen.