Tengo un proyecto en el que necesito leer/escribir archivos de gran tamaño.Comportamiento específico de std :: string en visual studio?
He decidido usar ifstream :: read() para poner esos archivos en la memoria en una sola pasada, en una std :: cadena. (que parece ser la forma más rápida de hacerlo en C++: http://insanecoding.blogspot.com/2011/11/how-to-read-in-file-in-c.html y http://insanecoding.blogspot.com/2011/11/reading-in-entire-file-at-once-in-c.html)
Al cambiar entre archivos, que luego necesidad de "reiniciar" el std :: string usado como el búfer de memoria anterior (es decir, borrar el char [] buffer para liberar memoria)
traté:
std::string::clear()
std::string::assign("")
std::string::erase(0, std::string::npos)
std::string::resize(0)
std::string::reserve(0)
pero, en Visual Studio 2008, esto no libera la memoria utilizada dentro de la std :: string en sí: su memoria intermedia subyacente no está desasignado
La única forma que encontré para eliminarlo es llamar a std :: string :: swap (std :: string ("")) para forzar el cambio de los búferes internos entre la std :: cadena real y la vacía en param.
Me parece que este comportamiento un poco extraño ...
yo sólo probamos en Visual Studio 2008, no sé si se trata de un comportamiento STL-estándar o si se trata de MSVC específica.
¿Me puede dar alguna pista?
El intercambio es una forma estándar de hacer que los contenedores liberen memoria reservada. Y leer el archivo usando 'std :: string' está muy lejos de la forma óptima. –
@VladLazarenko: estándar, y posiblemente el más rápido. – Nawaz
¿Por qué ** espera ** que alguien desasigne el búfer? C++ 11 agrega el explícito 'shrink_to_fit()' para realizar una solicitud no vinculante de desasignación. –