Я столкнулся с проблемой, которая была вызвана соединением перегруженных операторов new / delete и STL (особенно std: : строка). Вот мой случай ...
Я компилирую разделяемую библиотеку (назовите ее libfoo.so), в которой я перегружаю операторы new и delete . Чтобы не влиять на программу, которая будет использовать эту библиотеку, я сделал символы new и delete скрытыми. Также моя библиотека использует STL, особенно std :: string, который, как я ожидаю, должен использовать мои операторы new / delete , так как это класс шаблона.
Когда я компилирую библиотека с -O1 и выше, я получаю SIGABRT, который был вызван использованием различных операторов new / delete в конструкторе / деструкторе basic_string. new вызывается из libstdc ++., Но delete вызывается из моей библиотеки.
Когда я компилирую библиотеку с -O0 или -fno-inline операторы new / delete для конструктора / деструктора basic_string оба вызываются из libstdc ++.
Я сделал минимальный пример, который демонстрирует такое поведение: https://github.com/yekatkov/CustomNewDelete
Шаги для воспроизведения ошибки находятся в Readme.md.
Это нормальное поведение оптимизации? Или, может быть, я должен использовать std :: string по-другому? Как заставить классы stl в моей библиотеке использовать мои new / delete ? Предположим, что моя настоящая библиотека имеет тонны классов stl, поэтому я не могу переопределить распределитель для каждого из них. : (
Я использую glib c 2.27, г cc 5.5.0
Буду рад выслушать любые идеи:)
Спасибо!