Проблема с повреждением данных в потоке.

0

У меня проблема с использованием stringstreams

Когда я запускаю этот код, первый printf отлично, но в какой-то момент он заражается и печатает более короткую строку.

string CJpsURI::getURIwithSipIpPort()
{
    stringstream ss;
    ss << "sip:" << m_ipAddr << ":" << m_portAddr;
    string out = ss.str();
}

main() {

    CJpsURI localIp();
    localIp.setIpPort("192.168.88.1", 5060);

    char *s = localIp.getURIwithSipIpPort().c_str();

    printf("This is the sip port: %s", s);  // this may be ok  -- sip:192.168.88.1:5060
    // do some stuff
    printf("This is the sip port: %s", s);  // wrong; -- sip:192.168.8/030/004

}

Похоже, что * s указывает на внешнюю строку в стеке, которая уничтожается. Но это не должно происходить с тех пор, как я возвращаюсь, а не ссылкой.

Но это, похоже, работает.

string CJpsURI::getURIwithSipIpPort()
{
    string out = (boost::format("sip:%1%:%2%") % m_ipAddr % m_portAddr).str();
    return out;
}

main() {

    CJpsURI localIp();
    localIp.setIpPort("192.168.1.1", 5060);

    char *s = localIp.getURIwithSipIpPort().c_str();

    printf("This is the sip port: %s", s);  // this may be ok
    // do some stuff
    printf("This is the sip port: %s", s);  // this will be ok too;

}

Любые идеи были бы хорошы

  • 7
    Ваша первая функция ничего не возвращает.
  • 3
    Что является неопределенным поведением (со ссылкой на комментарий @Galik's Galik.)
Показать ещё 2 комментария
Теги:
string
stringstream

3 ответа

3

У вас есть две проблемы:

  1. Как заметил Ремейбл и Галик: Ваша функция не возвращается. Поэтому я соглашаюсь с Galik, что вам нужно адаптировать свою функцию к:

string CJpsURI::getURIwithSipIpPort()
{
stringstream ss;
ss << "sip:" << m_ipAddr << ":" << m_portAddr;
return ss.str();
}

  1. char* указывает на массив char s. Здесь вы хотите, чтобы массив найден внутри строки, возвращаемой getURIwithSipIpPort. Но эта память будет выпущена, как только эта строка закончится! На это ничего не висит. Так что вам действительно нужно сделать:

    string s {localIp.getURIwithSipIpPort()};

  • 0
    Столько комментариев в моем коде пробуют разные вещи, что я плохо копировал и вставлял. Мой исходный код был «возвращен» как мое последнее утверждение.
  • 0
    @ user846566 Если установка кода, как описано в одном из наших ответов, решила вашу проблему, я призываю вас принять этот ответ.
2

Стандарт C++ гласит:

§ 6.7/2 [..] Вытекание конца функции эквивалентно возврату без значения; это приводит к неопределенному поведению в возвращающей значение функции.

Второе проблемное утверждение:

char *s = localIp.getURIwithSipIpPort().c_str();

Во-первых, преобразование из const char* в char* устарело. Используйте const char*. Во-вторых, не делайте этого в первую очередь. Если вы хотите продлить срок службы временного, используйте ссылку const.

const std::string& s = localIp.getURIwithSipIpPort().c_str();
1

Ваша первая функция ничего не возвращает:

string CJpsURI::getURIwithSipIpPort()
{
    stringstream ss;
    ss << "sip:" << m_ipAddr << ":" << m_portAddr;
    string out = ss.str(); // This does not get returned!
}

Попробуй это:

string CJpsURI::getURIwithSipIpPort()
{
    stringstream ss;
    ss << "sip:" << m_ipAddr << ":" << m_portAddr;
    return ss.str(); // Now it returns something!
}
  • 0
    Столько комментариев в моем коде пробуют разные вещи, что я плохо копировал и вставлял. Мой исходный код был «возвращен» как мое последнее утверждение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню