Pensemos en esto con mucho cuidado. libA.so está estáticamente vinculado con el STL. Sin embargo, el STL no existe de forma aislada, requiere el tiempo de ejecución C (CRT). Ambos residen en libstdc ++. Una biblioteca estática. Esto significa que libA.so y libB.so tienen estructuras de datos CRT separadas. En particular, el montón usado por libA.so es diferente del montón usado por libB.so. Asignar una cadena del montón de tiempo de ejecución de libA e intentar liberarse del tiempo de ejecución de libB simplemente no funcionará porque el tiempo de ejecución de libB no tiene registros de asignación de la cadena. La única forma de destruir correctamente la cadena es llamando al destructor dentro de libA.so.
Uno podría preguntar: pero libB.so recibe una copia de la cadena, ¿verdad? Sí, eso es correcto, pero ¿quién ha asignado esta copia? Se ha asignado utilizando el constructor de copia dentro del contexto del tiempo de ejecución de libA.
Dicho esto, aún puede usar la cadena de libB.so. Simplemente no puedes destruirlo desde allí.
También puede permitir que libB reciba un puntero a la cadena y luego cree una copia dentro del contexto del tiempo de ejecución de libB. Esa copia puede ser destruida por libB.
Y es por eso que el enlace estático a veces es malo.