2011-10-02 12 views
8

Actualización: El siguiente problema parece depender de la opción -fwhole-program.¿Cómo std :: string asigna memoria en GCC con -fwhole-program?

He estado jugando un poco con la asignación de memoria, y me encontré con un pequeño misterio: En GCC (4.6), ¿cómo se asignan std::string su memoria [editar ] cuando compilo con -fwhole-program [/]?

tiene este programa de prueba siguiente:

#include <new> 
#include <string> 
#include <iostream> 
#include <cstdlib> 

void * operator new(std::size_t n) throw(std::bad_alloc) 
{ 
    void * const p = std::malloc(n); 

    if (p == NULL) throw std::bad_alloc(); 

    std::cerr << "new() requests " << n << " bytes, allocated at " << p << ".\n"; 

    return p; 
} 

void operator delete(void * p) noexcept 
{ 
    std::cerr << "delete() at " << p << ".\n"; 
    std::free(p); 
} 

int main() 
{ 
    std::string s = "Hello world."; 
} 

Cuando utilizo cualquier otro recipiente dinámico (que utiliza std::allocator<T>), el asignador utiliza ::operator new, y por lo que ver los mensajes de depuración felizmente. Sin embargo, con std::string, no veo nada en absoluto. Sin embargo, estoy seguro de que la asignación dinámica ocurre, como puedo confirmar con valgrind (se asignan 13 bytes de longitud de cadena). Revisé varios archivos fuente y el estándar, y estoy bastante seguro de que la plantilla es std::basic_string<T, std::char_traits<T>, std::allocator<T>>, por lo que no entiendo por qué no veo los mensajes de las funciones de asignación reemplazadas.

¿Alguien puede arrojar algo de luz sobre este enigma? ¿Qué debo hacer para seguir las asignaciones de cadenas? Además, ¿podría alguien ejecutar esto a través de otro compilador y ver si produce alguna salida?

(Por ejemplo: si añado std::map<int, int> m { { 0, 1 } };, tengo salida new() requests 24 bytes, allocated at 0x8d53028 etc.)

+0

Tenga cuidado con la optimización del pequeño búfer. –

+0

Actualización: ¡El problema solo aparece (en GCC 4.6.1 y 4.4.3) si compilo con '-fwhole-program'! –

+0

FWIW: Estoy obteniendo salida de su nueva versión personalizada utilizando g ++ 4.5.2 de 64 bits, en modo de depuración u optimización. –

Respuesta

4

Mirando a la salida del g++ ... -S con/sin -fwhole-program Parece que el conjunto Medida/borrar los operadores no se emiten en absoluto cuando se usa fwhole-program.

Estoy empezando a sospechar que estamos viendo un error aquí.

+0

Gracias! Tal vez presente esto como un error, y podemos ver si alguno de los desarrolladores puede confirmarlo. –

+0

¡Es extraño que con cualquier otro contenedor el operador * * se acostumbre! –

+0

Está siendo resuelto ahora en el informe de error. ¡Gracias! –

Cuestiones relacionadas