Double free () при использовании wostringstream :: str () после удаления символов

Следующий фрагмент кода компилируется и отлично работает во всех конфигурациях, кроме случаев, когда я strip символы отладки, что приводит к падению с двойным свободным указателем внутренней строки, когда t выходит за рамки в bar(), malloc: *** error for object 0x11af79760: pointer being freed was not allocated

Я не могу найти ничего ни в одном примере, или в документации, которая предполагает, что это неправильный способ ostringstream а также ss.str(),

std::wstring foo() {
std::wostringstream ss;
ss << L"this is a not too long string";
return ss.str();
}

void bar() {
// unrelated stuff

auto t = foo();

// unrelated stuff
}

Это на iOS, используя Xcode 7.2, w. clang ++ 7.0.2 (700.1.81), c ++ 14 включен и независимо от уровня оптимизации (при условии, что он не полностью оптимизирован).

Это довольно большой проект, я пока не смог воспроизвести его в минимальном проекте. Я могу перемещать код, и это все еще происходит каждый раз, что устраняет повреждение памяти. (Код также выглядит хорошо) Сложность написанного ss не имеет значения, я даже могу удалить эту строку.

Я не могу заставить один и тот же код ломаться на Mac, используя тот же компилятор и код, предполагая, что, возможно, проблема связана с arm в сочетании с разборкой символов, чем реализация c ++.

Я недостаточно изучил внутреннюю информацию о том, что делает разметка символов, кроме того, что я ожидаю, но мне кажется очень странным, что раздевание символов повлияло бы на что угодно.

Я перепробовал все виды разумных и неразумных способов обернуть возвращение дополнительной строкой и вручную получить доступ к внутреннему rdbuf, но это не имеет значения (в любом случае реализация библиотеки делает именно это).

Когда это случается, приложение сразу падает, так что инструментарий с помощью Zombies пока не дал ничего полезного. Я также попытался скомпилировать и запустить на нескольких устройствах, с чистыми сборками и инкрементными.

Я также ужасно ржавый, когда дело доходит до отладки ассемблера C ++ (особенно в XCode), поэтому я не смог найти там ничего странного.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …