Du verwaltest in deinem
commandParts in der zweiten Variante
dangling Pointer – Pointer auf Objekte, die gar nicht mehr existieren.
Das Problem ist diese Zeile:
Code: Alles auswählen
commandParts.push_back((char*)(settings.mainPath + "Programmname").c_str());
Du nimmst dort per
c_str() einen
char * von einem String, das nach der Zeile nicht mehr existiert.
Der
Operator + eines std::string gibt dir einen
neuen String zurück. Da aber nicht dafür gesorgt wird, dass der weiter lebt (in dem er z.B. in einem zweiten Vector abgelegt wird), wird er nach der Verwendung wieder freigegeben. Dies hier erzeugt den neuen String:
Warum benutzt du überhaupt einen
std::vector<char *>? Warum nicht direkt
std::vector<std::string>? Damit ginge genau das, was du hier (soweit erkennbar) vorhast:
Code: Alles auswählen
std::vector<std::string> commandParts;
commandParts.push_back(settings.mainPath + "Programmname");
std::cout << "command[0]=" << command[0] << std::endl;
Kurz und bündig – und C++-typisch, ohne fehlerträchtige Pointerjongliererei, wo sie eh nicht sinnvoll oder notwendig ist.
Noch zur Verdeutlichung, in C übersetzt macht deine zweite Variante Folgendes:
Code: Alles auswählen
char *commandParts[1];
commandParts[0] = strcat(mainPath, "Programmname");
free(commandParts[0]); // Der zusammenghängte String wird freigegeben, der Pointer aber nicht verworfen …
char **command = commandParts; // … und sogar nach dem Freigeben weiterbenutzt.
printf("%s\n", command[0]);
Und noch als Ergänzung:
std::vector::c_str() gibt einen
const char * zurück. Du castest hier das const weg. Falls du sogar auf dem Wege dort reinschreiben willst, ist das strenggenommen
undefined Behavior.