c_str gib komische sachen zurück



  • Also ich hab folgenes Problem: Ich habe eine Funktion
    die einen "char*" zurück gibt. in dieser Funktion
    verwende ich einen "C++ String", setzte diesen und mache
    dann ein return mit c_str()!Aber c_str haut völligen
    quatsch raus!Ich habe das gefühl das er einfach irgendwo
    im Speicher liest nur nicht meinen String.

    std::string TestLib::strFoo(std::string para)
    {
    	para.append("++");
    
    	return para;
    }
    
    extern "C"
    {
    
    	char *TestFoo()
    	{
    		TestLib *objTest = new TestLib();
    
    		std::string strTest = objTest->strFoo("Hello");
    
    		char *chTest = const_cast<char *>(strTest.c_str());
    
    		return chTest;
    	}
    
    }
    


  • strTest.c_str() gibt einen Zeiger auf die Daten zurück, die von strTest verwaltet werden. Am Ende der Funktion wird strTest gelöscht und damit der Speicherbereich auch frei gegeben. Der vorher zurückgelieferte Zeiger zeigt also nach der Funktion auf nicht mehr gültigen Speicher.

    Tntnet



  • Basingstoke schrieb:

    Ich habe das gefühl das er einfach irgendwo
    im Speicher liest nur nicht meinen String.

    Warum sollte er (wer?) das tun? ich würde dir allerding empfehlen eine referenz/pointer an die erste funktion zu übergeben (und diese natürlich auch zurückgeben lassen) und der cast ist nicht notwendig, da c_str() schon char zurückgibt, also ist auch die Variable nicht notwendig, einfach return strTest.c_str().



  • Du hast ja auch nur ein temproräres strTest. Soll heißen, du hast nirgends ein dynamischen C-String angelegt. c_str liefert dir keinen dynamischen String zurück, sonst müsste man diesen ja immer selber mit delete löschen. Sobald TestFoo() verlassen wird, ist der Return von c_str undefiniert.



  • Ehm... keine Ahnung, aber ist C++-Code in extern "C" überhaupt möglich? 😕



  • Ja es ist möglich...es geht darum das diese Funktion "C"-Konform
    kompiliert wird...es soll eine schnittstelle für C sein...

    @larz:der cast ist notwendig, weil c_str() einen "const char *"
    zurück gibt

    aber ich hab wirklich etwas gepennt!mit dem pointer!

    danke!


Log in to reply