【问题标题】:Objective C++ Crash on C++ String Array AppendC++ 字符串数组追加上的目标 C++ 崩溃
【发布时间】: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-&gt;append(s) 不会追加到数组中,而是尝试在数组中的第一个 std::string 上调用 append - 即使没有。
  • 好的,您已经声明了一个大小为零的数组,因此您无能为力,即使您的编译器允许代码作为扩展传递。此外,C++ 中不存在空数组。数组具有固定的大小,并且包含固定数量的元素。有一些标准库类型可以为动态数组建模,可以为空。例如,std::vector&lt;std::string&gt;
  • @jaunchopanza 所以,看来我做错了。不像我的 Days 字符串数组,它似乎工作,然后我需要 Minutes 作为一个向量,然后将字符串附加到该向量,对吧?如果是这样,那么我需要阅读 C++ 中的向量。

标签: c++ arrays stl append objective-c++


【解决方案1】:

如果您打算在Minutes中保留空字符串,请执行以下操作

std::string Minutes[] = {""};

然后Minutes-&gt;append(s);会将s附加到Minutes[]数组中的第一个空字符串。

更新:

首先你必须创建一个字符串的动态数组(std::vector),以防你不知道数组的大小如下,并使用索引从std::vector访问字符串。

// implies that you used #include <string> and #include <vector>
std::vector<std::string> Minutes;
Minutes.push_back(s)

【讨论】:

  • 抱歉,这似乎是个坏建议。在 cmets 中,他说他希望追加到数组,而不是第一个数组元素......
  • 我可以这么说,但是,这个更改确实防止了程序在猴子测试期间崩溃!耶!但是,它也告诉我,当我认为我在附加分钟时,我实际上是在附加一个字符串,而不是一个字符串数组。如何像对 Days 一样成功地附加到字符串数组(尽管我对那个字符串进行了硬编码)?
  • 这仍然是追加到数组in的字符串,当他想追加一个字符串数组时。即std::vector::push_back...
  • 这行得通。我还必须学会添加#import &lt;vector&gt;,而不仅仅是#import &lt;string&gt;
  • @Volomike #include
猜你喜欢
  • 2011-08-24
  • 2015-11-03
  • 1970-01-01
  • 2013-05-12
  • 2013-03-25
  • 2015-11-17
  • 1970-01-01
相关资源
最近更新 更多