Следующая процедура Objective C++, если я запускаю ее достаточно часто в XCode 7.1 на OS X 10.11, в конечном итоге терпит крах при добавлении строки. Отладчик показывает, что она каждый раз останавливается на числе 23 (пытается добавить число 23). Я предполагаю, что это связано с распределением памяти. Что я делаю неправильно?

Отладчик открывает класс string и застревает на операторе возврата ниже. В другом окне отладчика написано (lldb), что бы это ни значило.

шаблон 
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());
}

Здесь приведен мой код, который, похоже, приводит к сбою, если я запускаю процедуру достаточное количество раз. (Это наблюдалось только во время тестирования на обезьяне, когда я нажимал на меню Settings в приложении 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));
}

Volomike

Ответы (1)

Если вы намерены хранить нулевую строку в Minutes, сделайте следующее

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

Тогда Minutes->append(s); добавит s к первой нулевой строке внутри массива Minutes[].

Обновление:

Сначала нужно создать динамический массив (std::vector) строк, в случае, если вы не знаете размер массива следующим образом, и использовать индекс для доступа к строке из std::vector.

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

2022 WebDevInsider