Mam projekt, w którym potrzebuję do odczytu/zapisu dużych plików.Specyficzne zachowanie std :: string w visual studio?
Postanowiłem użyć ifstream :: read(), aby umieścić te pliki w pamięci w jednym przebiegu, w std :: string. (który wydaje się być najszybszy sposób to zrobić w C++: http://insanecoding.blogspot.com/2011/11/how-to-read-in-file-in-c.html i http://insanecoding.blogspot.com/2011/11/reading-in-entire-file-at-once-in-c.html)
Podczas przełączania między plikami, to wtedy trzeba „reset” na std :: string używany jako bufor pamięci poprzedniego (tj wymazać char [] buffer do wolnej pamięci)
próbowałem:
std::string::clear()
std::string::assign("")
std::string::erase(0, std::string::npos)
std::string::resize(0)
std::string::reserve(0)
ale pod Visual Studio 2008, to nie zwalnia pamięć używaną wewnątrz std :: samego łańcucha: jego podstawowej bufor nie jest anulowane.
Jedyny sposób, w jaki go usunąłem, to wywołanie std :: string :: swap (std :: string ("")) wymuszenie zmiany buforów wewnętrznych między rzeczywistym std :: string i empty w parametrze.
znajdę ten problem nieco dziwne ...
I tylko przetestowane w Visual Studio 2008, nie wiem, czy to zachowanie STL standardzie lub jeśli to MSVC specyficzne.
Czy możesz podać mi jakąś wskazówkę?
Zamiana to standardowy sposób udostępniania pojemnikom zarezerwowanej pamięci. Odczytanie pliku przy użyciu 'std :: string' jest daleko od optymalnego sposobu. –
@ VladLazarenko: standardowa i możliwie najszybsza. – Nawaz
Dlaczego ** miałbyś ** oczekiwać, że ktoś zwolni bufor? C++ 11 dodaje jawne 'shrink_to_fit()', aby wykonać niewiążące żądanie usunięcia. –