Hãy suy nghĩ về điều này rất cẩn thận. libA.so được liên kết tĩnh với STL. Tuy nhiên, STL không tồn tại trong sự cô lập, nó yêu cầu thời gian chạy C (CRT). Cả hai đều cư trú trong libstdc ++. Một thư viện tĩnh. Điều này có nghĩa là libA.so và libB.so có cấu trúc dữ liệu CRT riêng biệt. Cụ thể, heap được libA.so sử dụng khác với heap được libB.so sử dụng. Phân bổ một chuỗi từ đống thời gian chạy của libA và cố gắng thoát khỏi thời gian chạy của libB sẽ không hoạt động vì thời gian chạy của libB không có bản ghi phân bổ chuỗi. Cách duy nhất để hủy chính xác chuỗi là bằng cách gọi hàm hủy trong libA.so.
Người ta có thể hỏi: nhưng libB.so nhận được một bản sao của chuỗi, phải không? Đúng, nhưng ai đã phân bổ bản sao này? Nó đã được phân bổ bằng cách sử dụng hàm tạo sao chép trong bối cảnh thời gian chạy của libA.
Điều đó nói rằng, bạn vẫn có thể sử dụng chuỗi từ libB.so. Bạn không thể phá hủy nó từ đó.
Bạn cũng có thể để libB nhận một con trỏ tới chuỗi và sau đó tạo một bản sao của nó trong bối cảnh thời gian chạy của libB. Bản sao đó có thể bị phá hủy bởi libB.
Và đó là lý do tại sao liên kết tĩnh đôi khi là xấu.