以下代码段在所有配置中编译并运行完美,除非我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 ++ arm汇编程序时(特别是在Xcode中),我也非常生疏,所以我无法找到奇怪的东西。