blöde frage?



  • hi,

    komme mir mit der frage mächtig blöd vor aber programmiere halt noch nicht so lange mit c++. Dachte eigentlich, dass lokale variablen wie die stringstream variable im minimalbeispiel bei austritt aus der funktion gelöscht werden und ein delete nur notwendig ist wenn zuvor speicher mit new freigegeben wurde.
    Dieser logik zur folge dürfte doch bei der funktion der speicherbedarf nicht kontinuierlich wachsen, was er bei dem minimalbeispiel aber tut (zumindest wenn mans wie ich mit VS 2005 compiliert). oder doch ? wenn ja, warum? . Ok, auch wenn die frage doof ist freue ich mich über antworten 😉

    #include <cstdlib>
    #include <sstream>
    
    using namespace std;
    
    void stringTest(){
    	stringstream ss;
    }
    
    int main (void){
    	for(int i=0; i< 1000000; i++){
    		stringTest();	
    	}
    }
    


  • Ich halte dieses Verhalten von stringstream für einen Bug in der STL.
    Bei istringstream und ostringstream wird der Speicher wieder freigegeben.
    stringstream gibt Heapspeicher nicht wieder frei (der Stack läuft schliesslich nicht über!)
    😞



  • danke erstmal für die schnelle antwort.
    mal angenommen du hast recht, kann mir dann einer sagen, wie ich mehrstellige zahlen ohne stringstream aus einem string in integer konvertiere. die zahlen stehen hintereinander und sind durch trennstriche getrennt. der string sieht also wie folgt aus:

    12|3|344|4|3211|6674|1|87|23......

    ich muss alle zahlen zwischen zwei trennstrichen einlesen. und leider geschieht das ganze ziemlich
    oft, weshalb mir die folgende implementierung den speicher zuballert. irgendjemand eine idee wie ich das anders realisieren kann?

    void FileHandler::stringToTableModel(string& s, AbstractTableModel* tm){	
    	stringstream convert;
    	uint k=0, value;
    	tm->clear();
    	for(uint i=0; i<s.length(); i++){	
    		convert.clear();
    		while(s[i]!='|'){
    			convert << s[i++];	
    		}
    		convert >> value;
    		tm->setValueAt(k++, value);
    	}
    	convert.clear();	
    }
    


  • int main (){ 
    
        char tmp;
        unsigned int value[9];
        string s("12|3|344|4|3211|6674|1|87|23");
        istringstream istr(s);
    
        for (int i = 0; i < 9; i++)
        {
            istr >> value[i];
            istr >> tmp;
        }
    }
    

    Eventuell mit dieser Methode?
    mfg



  • lol, doch so schwer ;). super, danke. sollte mir wohl mal die klasse istringstream genauer ansehen...


Anmelden zum Antworten