В нашем коде на С++ у нас есть собственный класс строк (по старым причинам). Он поддерживает метод c_str()
, похожий на std::string
. Я заметил, что многие разработчики используют его неправильно. Я уменьшил проблему до следующей строки:
const char* x = std::string("abc").c_str();
Этот, казалось бы, невинный код довольно опасен в том смысле, что деструктор на std::string
вызывается сразу после вызова c_str()
. В результате вы удерживаете указатель на выделенную ячейку памяти.
Вот еще один пример:
std::string x("abc");
const char* y = x.substr(0,1).c_str();
Здесь также мы используем указатель на выделенное местоположение.
Эти проблемы нелегко найти во время тестирования, поскольку в памяти по-прежнему содержатся достоверные данные (хотя сама ячейка памяти недействительна).
Мне интересно, есть ли у вас какие-либо предложения относительно того, как я могу изменить определение класса/метода, чтобы разработчики никогда не могли совершить такую ошибку.