Pensiamo a questo molto attentamente. libA.so è collegato staticamente con l'STL. Tuttavia, l'STL non esiste in modo isolato, richiede il runtime C (CRT). Entrambi risiedono in libstdc ++, una libreria statica. Ciò significa che libA.so e libB.so hanno strutture di dati CRT separate. In particolare, l'heap utilizzato da libA.so è diverso dall'heap utilizzato da libB.so. L'allocazione di una stringa dall'heap di runtime di libA e il tentativo di liberare il runtime di libB semplicemente non funzionano perché il runtime di libB non ha record di allocazione della stringa. L'unico modo per distruggere correttamente la stringa è chiamando il distruttore all'interno di libA.so.
Si potrebbe chiedere: ma libB.so riceve una copia della stringa, giusto? Sì, è giusto, ma chi ha assegnato questa copia? È stato assegnato utilizzando il costruttore di copie nel contesto del runtime di libA.
Detto questo, puoi ancora usare la stringa da libB.so. Non puoi semplicemente distruggerlo da lì.
Puoi anche consentire alla libB di ricevere un puntatore alla stringa e quindi crearne una copia nel contesto del runtime della libB. Quella copia può essere destrutturata da libB.
Ed ecco perché il collegamento statico a volte è cattivo.