【发布时间】:2014-04-10 22:32:30
【问题描述】:
当使用最新的 XCode 5.1、iOS SDK 7.1 和 LLVM 5.1 构建时,将 libstdc++ 用于 C++ 标准库,仅在 iOS 5.1 设备上的 std::string append 方法会崩溃。
下面是代码示例:
class TestClass
{
public:
TestClass()
{
m_string = "string1";
}
void AppendString()
{
m_string += std::string("string2");
std::string newString2 = m_string + "string3";
}
private:
string m_string;
};
App 在这一行的 AppendString() 方法中崩溃:
std::string newString2 = m_string + "string3";
如果我在创建 newString2 之前删除此行 m_string += std::string("string2");,代码可以正常工作。
这是崩溃的堆栈跟踪:
#0 0x34c99fe8 in memcpy$VARIANT$CortexA8 ()
#1 0x3706f95a in std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned long) ()
#2 0x3706fbfa in std::string::reserve(unsigned long) ()
#3 0x3706fdb0 in std::string::append(char const*, unsigned long) ()
#4 0x000c0e5a in std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*) [inlined] at /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/usr/include/c++/4.2.1/bits/basic_string.h:2121
#5 0x000c0e3c in TestClass::AppendString() at /Users/sergei/Documents/2_3/House of Fun/cpp/CasinoSceneManager.cpp:122
有没有人经历过同样的崩溃?它仅在装有 iOS 5.1 和 5.1.1 的设备上发生,并且仅当应用程序编译时使用 release 标志,而不是 debug。
感谢您的帮助。
还有一个注意事项。 如果我在项目设置的 Code Generation 部分将 Optimization level 更改为 None [-O0],一切正常。 也许这个问题与代码优化有关。
【问题讨论】:
-
还有一个注意事项。如果我将此行
std::string newString2 = m_string + "string3"更改为std::string newString2 = std::string(m_string) + "string3"代码也可以正常工作。 -
这是您正在运行的唯一代码还是程序正在执行其他操作?听起来有点像无效对象的问题。
-
这只是一个测试类来显示问题。在我的 iOS 应用程序的主循环中,我使用以下代码调用它:
TestClass* c = new TestClass; c->AppendString(); -
这是整个班级?如果是,则错误很可能在于周围的代码,其中 something 具有未定义的行为。
-
我无法显示整个代码,因为项目很大。我只想告诉如果你有 std::string 变量作为类字段,并尝试将它与其他字符串连接并将连接结果分配给其他 std::string 变量,应用程序将崩溃,但仅在 iOS 5.1 设备上.
标签: c++ ios xcode ios7.1 xcode5.1