【发布时间】:2016-04-06 03:01:12
【问题描述】:
如果我在 OS X 10.11 上的 XCode 7.1 中运行足够多的以下 Objective C++ 例程,最终会在字符串追加时崩溃。调试器告诉我它每次都在数字 23 处停止(试图附加数字 23)。我想这与内存分配有关。我做错了什么?
调试器打开字符串类并卡在下面的返回语句上。在另一个调试器窗口中,它显示 (lldb),不管它是什么意思。
template <class _CharT, class _Traits, class _Allocator>
inline _LIBCPP_INLINE_VISIBILITY
basic_string<_CharT, _Traits, _Allocator>&
basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str)
{
return append(__str.data(), __str.size());
}
这是我正在运行的代码,如果我运行例程足够多次,它似乎会导致崩溃。 (这只出现在猴子测试期间,我在我的 Objective C/C++ 应用程序中点击了我的设置菜单足够多次,它触发了以下函数足够多次崩溃。)
std::string Minutes[] = {};
std::string s = "";
for (int i = 1; i<= 59; i++) {
s = std::to_string(i);
if (s.length() < 2) {
s = "0" + s;
}
s = ":" + s;
Minutes->append(s);
}
这可能是一个普通的老 C++ 问题,也许不是一个 Objective C++ 问题。或者,这可能是 Apple 的错误?
请注意,我进行了以下更改的实验,并且在 3 次尝试 100 次后它从未崩溃:
std::string Minutes[] = {};
std::string s = "";
for (int i = 1; i<= 59; i++) {
//s = std::to_string(i);
/*
if (s.length() < 2) {
s = "0" + s;
}
s = ":" + s;
*/
//[Minutes->append(s);
Minutes->append("01");
}
此外,以下代码补丁也运行 3 次,最多 100 次,没有问题:
const std::string Days[] = {"Su","M","T","W","Th","F","Sa"};
std::string Hours[] = {};
for (int i = 1; i <= 12; i++) {
Hours->append(std::to_string(i));
}
【问题讨论】:
-
std::string Minutes[] = {};这不是有效的 C++。但如果是的话,你希望它做什么? -
初始化一个空数组,以便我可以将项目附加到它?我对 C++ 很熟悉。
-
Minutes->append(s)不会追加到数组中,而是尝试在数组中的第一个std::string上调用append- 即使没有。 -
好的,您已经声明了一个大小为零的数组,因此您无能为力,即使您的编译器允许代码作为扩展传递。此外,C++ 中不存在空数组。数组具有固定的大小,并且包含固定数量的元素。有一些标准库类型可以为动态数组建模,可以为空。例如,
std::vector<std::string>。 -
@jaunchopanza 所以,看来我做错了。不像我的 Days 字符串数组,它似乎工作,然后我需要 Minutes 作为一个向量,然后将字符串附加到该向量,对吧?如果是这样,那么我需要阅读 C++ 中的向量。
标签: c++ arrays stl append objective-c++