Esto es ilegal, pero no por las razones que estás pensando.
La diferencia entre std::malloc()
/std::free()
y new
/delete
es que este último llame constructores/destructores, mientras que el primero no lo hará. La expresión
void* p = std::malloc(sizeof(run_male_walker_struct))
devolverá un blob de memoria no inicializada en la que no se llama a ningún constructor. No se debe tocar con un palo de diez pies - a excepción de la invocación de un constructor en él:
run_male_walker_struct* pw = new(p) run_male_walker_struct;
Si lo hace, tendrá que hacer a la inversa, también:
pw->~run_male_walker_struct();
antes liberas la memoria:
std::free(p);
Sin embargo, eso deja la pregunta de por qué quieres hacer eso.
La única razón para hacer esto debe ser cuando desee separar la asignación de memoria de la construcción (como, por ejemplo, en un asignador de grupo). Pero si lo necesita, lo mejor es esconderse detrás de alguna interfaz. Uno natural estaría sobrecargando new
y delete
por clase. Además, std::vector
hace esto internamente.
Usted está equivocado. El tamaño de 'struct run_male_walker_struct' se puede determinar en tiempo de compilación por el operador' sizeof'. Sin embargo, al usar 'malloc()' no se construirán las instancias 'std :: string'. – wilx
@wilx Estás en lo correcto, pero esto debería ser una respuesta, en lugar de un comentario :) – KSchmidt
¿No es la frase "C struct" poco engañosa ...? Además, la consulta parece estar en "C++ struct" :) – Arun